是否可以在TypeScript接口中使用getter/setter?

Ezw*_*ard 53 typescript

我想定义一个具有readonly属性的接口.例如;

interface foo {
    get bar():bool;
}
Run Code Online (Sandbox Code Playgroud)

但是,这会在语法上出现语法错误"expected';'".我已将VisualStudio设置为使用ES5目标,因此支持getter.这是接口的限制吗?未来可能会发生这种变化; 这是一件非常好的事情.

Vit*_*kov 70

Typescript 2.0中引入了仅限 Getter的属性:

interface foo {
    readonly bar: boolean;
}
Run Code Online (Sandbox Code Playgroud)

  • @AlexanderAbakumov readonly没有指定它必须是属性.由于属性的引用方式与getter相同,因此实现此接口的类可以自由使用属性或getter. (7认同)
  • 如果我没有弄错的话,这仍然宣称`bar`是一个属性,而不是一个吸气剂. (4认同)
  • @nikeee:是的,但OP问我们是否可以在接口中使用getter/setter,而不是属性. (3认同)
  • 那是一个只读属性,而不是一个吸气剂。此处显示了一些细微的差别:属性:只读bar:布尔getter:get bar():布尔{返回a && b || c &&!e || (x | y | z)} (3认同)
  • @robertotomás 这不仅是部分答案,而且是完整、正确的答案。拥有接口的全部原因是指定不关心实现细节的契约。如果要指定实现细节,请使用超类,而不是接口。 (3认同)
  • @AlexanderAbakumov,但这正是这个,一个吸气剂.如果您尝试分配给属性,则会出现此错误:错误TS2540(TS)无法分配给'bar',因为它是常量或只读属性. (2认同)

Val*_*tin 22

是的,这是接口的限制.是否使用getter实现对属性的访问是一个实现细节,因此不应该是公共接口的一部分.另见这个问题.

如果需要在接口中指定readonly属性,可以添加getter方法:

interface foo {
    getAttribute() : string;
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,它不是一个只读的实现细节.我希望我能在Typescript中表达这一点. (9认同)
  • 据推测,这将在TypeScript 2.0中成为可能:https://github.com/Microsoft/TypeScript/pull/6532 (2认同)

chh*_*vey 6

正如@Vitaliy Ulantikov 回答的那样,您可以使用readonly正如@Vitaliy Ulantikov 回答的那样,您可以在属性上这与吸气剂完全一样。

\n\n
interface Point {\n    readonly x: number;\n    readonly y: number;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

对象文字实现接口时,您不能覆盖readonly属性:

\n\n
let p1: Point = { x: 10, y: 20 };\np1.x = 5; // error!\n
Run Code Online (Sandbox Code Playgroud)\n\n

上课的时候实现了该接口时,就无法避免覆盖它。

\n\n
class PointClassBroken implements Point {\n    // these are required in order to implement correctly\n    x: number;\n    y: number;\n\n    constructor(x: number, y: number) {\n        this.x = x\n        this.y = y\n    }\n\n    changeCoordinates(x: number, y: number): void {\n        this.x = x // no error!\n        this.y = y // no error!\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我猜想\xe2\x80\x99s是因为当你在类定义中重新声明属性时,它们会覆盖接口的属性,并且不再是只读的。

\n\n

要解决这个问题,请使用readonly直接在实现该接口的类中使用属​​性

\n\n
class PointClassFixed implements Point {\n    readonly x: number;\n    readonly y: number;\n\n    constructor(x: number, y: number) {\n        this.x = x\n        this.y = y\n    }\n\n    changeCoordinates(x: number, y: number): void {\n        this.x = x // error!\n        this.y = y // error!\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

到操场上亲自看看吧。

\n