我想定义一个带有只读属性的接口。例如;
interface foo {
get bar():bool;
}
然而,这给出了语法错误,“预期的';'”在栏上。我已经将我的 VisualStudio 设置为使用 ES5 目标,因此支持 getter。这是接口的限制吗?将来可能会发生这种变化;能够做到这一点是一件非常好的事情。
我想定义一个带有只读属性的接口。例如;
interface foo {
get bar():bool;
}
然而,这给出了语法错误,“预期的';'”在栏上。我已经将我的 VisualStudio 设置为使用 ES5 目标,因此支持 getter。这是接口的限制吗?将来可能会发生这种变化;能够做到这一点是一件非常好的事情。
Typescript 2.0中引入了 Getter-only 属性:
interface foo {
readonly bar: boolean;
}
是的,这是接口的限制。是否使用 getter 实现对属性的访问是一个实现细节,因此不应成为公共接口的一部分。另请参阅此问题。
如果需要在接口中指定只读属性,可以添加 getter 方法:
interface foo {
getAttribute() : string;
}
正如@Vitaliy Ulantikov 回答的那样,您可以readonly
在属性上使用修饰符。这就像一个吸气剂。
interface Point {
readonly x: number;
readonly y: number;
}
当对象字面量实现接口时,您不能覆盖readonly
属性:
let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!
但是当一个类实现接口时,没有办法避免覆盖它。
class PointClassBroken implements Point {
// these are required in order to implement correctly
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x
this.y = y
}
changeCoordinates(x: number, y: number): void {
this.x = x // no error!
this.y = y // no error!
}
}
我猜那是因为当您在类定义中重新声明属性时,它们会覆盖接口的属性,并且不再是只读的。
要解决此问题,readonly
请直接在实现接口的类中使用属性
class PointClassFixed implements Point {
readonly x: number;
readonly y: number;
constructor(x: number, y: number) {
this.x = x
this.y = y
}
changeCoordinates(x: number, y: number): void {
this.x = x // error!
this.y = y // error!
}
}
在操场上亲自看看。