当前位置: 首页 > 知识库问答 >
问题:

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

施兴言
2023-03-14

目前,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?

共有3个答案

卫浩瀚
2023-03-14

首先,当目标是ECMascript 5时,Typecript只支持getset语法。要实现这一点,您必须使用

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方法的接口。但是,您也可以设置属性,然后让类决定如何实现接口。

阎功
2023-03-14

为了补充其他答案,如果您希望在接口上定义 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");
  }
}

不推荐的做法;而是一种选择。

太叔富
2023-03-14

您可以在接口上指定属性,但不能强制是否使用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。这是接口的限制吗?将来可能会发生这种变化;能够做到这一点是一件非常好的事情。