目前,TypeScript
不允许在接口中使用get/set方法(访问器)。例如:
interface I {
get name():string;
}
class C implements I {
get name():string {
return null;
}
}
此外,TypeScript 不允许在类方法中使用数组函数表达式:例如:
class C {
private _name:string;
get name():string => this._name;
}
有没有其他方法可以在接口定义上使用getter和setter?
首先,当目标是ECMascript 5时,Typecript只支持get
和set
语法。要实现这一点,您必须使用
tsc --target ES5
接口不支持getter和setter。要让您的代码编译,您必须将其更改为
interface I {
getName():string;
}
class C implements I {
getName():string {
return null;
}
}
typescript支持的是构造函数中字段的特殊语法。在你的情况下,你可以
interface I {
getName():string;
}
class C implements I {
constructor(public name: string) {
}
getName():string {
return name;
}
}
请注意类C
如何没有指定字段name
。它实际上是在构造函数中使用语法糖公共名称:字符串
声明的。
正如Sohnee指出的,该接口实际上应该隐藏任何实现细节。在我的例子中,我选择了需要java风格的getter方法的接口。但是,您也可以设置属性,然后让类决定如何实现接口。
为了补充其他答案,如果您希望在接口上定义 get 值
,则可以使用 readonly
:
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");
}
}
不推荐的做法;而是一种选择。
您可以在接口上指定属性,但不能强制是否使用getters和setters,如下所示:
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,我可以用一个属性来代替(下面的例子)——但是接口无论如何都应该隐藏这些实现细节,因为它是对调用代码的promise,promise它可以调用什么。
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);
最后,<code>=
class Test {
// Yes
getName = () => 'Steve';
// No
getName() => 'Steve';
// No
get name() => 'Steve';
}
我想在Java界面中定义cucumber测试步骤定义。 2其他类将实现此接口: 我有TestFactory类,它获取带有环境名称(Android或Apple)的属性并初始化对象: 问题:Cucumber通过名称获取所需的步骤,而不引用对象。采取< code > Landing _ Screen _ is _ visible()而非< code >步骤。land _ Screen _ is _ vi
问题内容: 人们如何看待在界面中使用的最佳指南?什么应该和不应该进入接口? 我听说有人说,通常,接口只能定义行为,而不能声明状态。这是否意味着接口 不应包含getter和setter? 我的观点:对于setter来说可能并非如此,但有时我认为将getter放置在接口中是有效的。例如,这仅是为了强制实施类来实现这些获取器,并指示客户端能够调用那些获取器以检查某些内容。 问题答案: 我认为一般有两种类
我想拆分我的验证器的声明和实现,与Spring boot环境中的这个问题非常相似。看起来好像是我让它几乎起作用了。我看到我的验证器实际上是由Spring验证调用的,但在执行验证后,Hibernate会抛出一个异常: 这是因为是一个接口(如预期)。 我已经这样配置了Spring(这是一个不同问题的答案): 我的自定义验证器: 所以它试图通过验证器名称找到一个Spring bean。所以我有一个验证器
问题内容: 我正在尝试使用jQuery在特定端口上运行AJAX查询: 这不起作用:没有进行AJAX调用,并且Firebug中没有任何异常。如果我不指定端口,它确实可以工作。有人知道为什么吗? 问题答案: 由于“ 同源来源”政策而无法使用。仅在相同的域,协议和端口中才允许AJAX请求。 如果您确实需要从该来源获取数据,则应该期待JSONP。
是否可以使用< code>-P参数来限制要公开的端口范围,例如: 或
我想定义一个具有只读属性的接口。例如; 但是,这会在栏上出现语法错误“预期';'”。我已将VisualStudio设置为使用ES5目标,因此支持getter。这是接口的限制吗?将来可能会发生这种变化;能够做到这一点是一件非常好的事情。