TypeScript中用于没有setter的属性的接口签名。
TypeScript中用于没有setter的属性的接口签名。
我们的一个类中有一个典型的getter,假设如下:
class Employee implements IEmployee { private _fullName: string; get fullName(): string { return this._fullName; } }
以及一个用于操作它的接口:
interface IEmployee{ fullName: string; }
当通过这个接口使用实例时,编译器如果尝试给fullName赋值,不会警告我们缺少setter,并且JS运行时会直接忽略任何赋值而不抛出错误。有没有办法将接口成员标记为只有getter或只有setter?
我看到过这个帖子,但是它相当旧了,我想知道现在有没有改进的地方。
TypeScript Interface中没有setter的属性会出现什么问题?出现问题的原因是什么?有哪些解决方法?
在TypeScript中,一个只有getter没有setter的属性不会产生编译错误,这与其他语言有一些微妙的不同。虽然在其他语言中,如果你试图设置一个只有getter的属性,编译器会报错,但在TypeScript中并不会。这是因为这个属性是只读的,无论你是否试图设置它,都不会有任何变化,设置操作会悄悄地失败。
以下是一个没有使用接口的示例:
class Example { get name() { return 'Steve'; } } var y = new Example(); y.name = 'Example 2'; alert(y.name);
在这个示例中,当我使用`x.name = 'Example 2';`时,并没有编译器警告。
如果有编译器警告,我会预期在接口中有一种指定属性只读性的方式。但根据上述信息,你无法在接口中设置只读属性。
interface Test { name: string; } class Example { get name() { return 'Steve'; } } var x: Test = new Example(); x.name = 'Example 1'; alert(x.name); var y = new Example(); x.name = 'Example 2'; alert(x.name);
这意味着你只能通过一个获取属性值的方法来强制只读性(并且显然不能设置方法)。
interface Test { getName: () => string; } class Example { getName() { return 'Steve'; } } var x: Test = new Example(); alert(x.getName()); var y = new Example(); alert(y.getName());
只读性在缺少setter的情况下已经由JavaScript的行为基本得到了保证。问题在于它是默默地吞噬了值。理想的(并且希望会出现的)解决方法是允许TypeScript接口成员标记为只有getter或setter。另一种解决方法是,在缺少getter或setter的情况下,编译器生成空的getter和setter,以便简单地抛出错误(至少对于setter来说,这是我们整个团队预期的行为)。最后一种繁琐的解决方法是如果不需要实际的setter,就手动创建一个抛出错误的setter。
,只读性在缺少setter的情况下已经由JavaScript的行为得到了保证,但问题在于它是默默地吞噬了值。目前唯一的解决方法是使用方法来访问属性,以获得编译时的保证,确保没有设置操作。同时,已经在GitHub上提出了这个问题的issue:[github.com/Microsoft/TypeScript/issues/814](https://github.com/Microsoft/TypeScript/issues/814)。
TypeScript Interface signature for property without setter. 这个问题的出现原因是在 TypeScript 中,当定义接口的属性时,如果不指定 setter,那么该属性将被视为只读属性,不可更改。然而,有时我们可能希望定义一个只有 getter 的属性,而不提供 setter。这种情况下,如果我们只是简单地省略 setter,TypeScript 会报错。
解决这个问题的方法是在接口定义中使用 `readonly` 修饰符来标记属性为只读。通过使用 `readonly` 修饰符,我们可以确保该属性的值不会被修改。
下面是一个使用 `readonly` 修饰符定义只读属性的示例:
interface IEmployee{ readonly fullName: string; }
在上面的示例中,`fullName` 属性被标记为只读属性,意味着它的值在初始化后不能再被修改。
通过使用 `readonly` 修饰符,我们可以确保只读属性的值不会在运行时被修改。这样可以提高代码的可靠性和可维护性,避免潜在的错误。
,TypeScript Interface signature for property without setter. 这个问题的解决方法是使用 `readonly` 修饰符来标记只读属性,以确保属性的值在初始化后不能被修改。这样可以提高代码的可靠性和可维护性。