在接口定义中可以使用getters / setter吗?

目前, TypeScript不允许在接口中使用get / set方法(访问器)。 例如:

 interface I { get name():string; } class C implements I { get name():string { return null; } } 

此外,TypeScript不允许在类方法中使用数组函数expression式:例如:

 class C { private _name:string; get name():string => this._name; } 

有没有其他方法可以在接口定义上使用getter和setter?

你可以在接口上指定属性,但不能强制使用getter和setter,就像这样:

 interface IExample { Name: string; } class Example implements IExample { private _name: string = "Bob"; public get Name() { return this._name; } public set Name(value) { this._name = value; } } var example = new Example(); alert(example.Name); 

在这个例子中,接口不强制类使用getter和setter,我可以使用一个属性(下面的例子) – 但是接口应该隐藏这些实现细节,因为它是对调用代码的承诺关于什么可以打电话。

 interface IExample { Name: string; } class Example implements IExample { // this satisfies the interface just the same public Name: string = "Bob"; } var example = new Example(); alert(example.Name); 

最后,类方法不允许使用=> – 如果您认为有一个燃烧的用例,您可以开始讨论Codeplex 。 这里是一个例子:

 class Test { // Yes getName = () => 'Steve'; // No getName() => 'Steve'; // No get name() => 'Steve'; } 

为了补充其他的答案,如果你的愿望是定义一个接口的get value ,你可以这样做:

 interface Foo { readonly value: number; } let foo: Foo = { value: 10 }; foo.value = 20; //error class Bar implements Foo { get value() { return 10; } } 

但据我所知,正如其他人所提到的那样,目前还没有办法在接口中定义一个纯集属性。 但是,您可以将限制移至运行时错误(仅在开发周期中有用):

 interface Foo { /* Set Only! */ value: number; } class Bar implements Foo { _value:number; set value(value: number) { this._value = value; } get value() { throw Error("Not Supported Exception"); } } 

不build议做法 ; 但是一个选项。

首先,Typescript只支持get set Ecmascript 5时getset语法。为此,您必须调用编译器

 tsc --target ES5 

接口不支持getter和setter。 为了让你的代码编译你将不得不改变它

 interface I { getName():string; } class C implements I { getName():string { return null; } } 

什么typecript支持是一个特殊的语法构造函数中的字段。 在你的情况下,你可以有

 interface I { getName():string; } class C implements I { constructor(public name: string) { } getName():string { return name; } } 

注意C类没有指定字段name 。 它实际上是在构造函数中使用语法糖public name: string来声明的。

Sohnee指出,接口实际上应该隐藏任何实现细节。 在我的例子中,我select了接口来需要一个java风格的getter方法。 不过,你也可以通过一个属性,然后让这个类决定如何实现这个接口。