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

是否可以在TypeScript接口中使用只读属性?[重复]

翟京
2023-03-14

我想定义一个具有只读属性的接口。例如;

interface foo {
    get bar():bool;
}

但是,这会在栏上出现语法错误“预期';'”。我已将VisualStudio设置为使用ES5目标,因此支持getter。这是接口的限制吗?将来可能会发生这种变化;能够做到这一点是一件非常好的事情。

共有3个答案

马琛
2023-03-14

正如@Vitaliy Ulantikov所回答的,您可以在属性上使用只读修饰符。这就像一个getter。

interface Point {
    readonly x: number;
    readonly y: number;
}

当对象文字实现该接口时,不能覆盖只读属性:

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!
    }
}

在操场上自己看。

申屠亦
2023-03-14

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

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

interface foo {
    getAttribute() : string;
}
习洲
2023-03-14

Typecript 2.0中引入了仅Getter属性:

interface foo {
    readonly bar: boolean;
}
 类似资料:
  • 问题内容: 查看mozilla文档,查看正则表达式示例(标题为“使用匹配结果创建数组”),我们有如下语句: 输入:一个只读属性,它反映与正则表达式匹配的原始字符串。 index:只读属性,它是字符串中匹配项的从零开始的索引。 等等…是否可以在JavaScript中创建具有只读属性的对象,或者这是对特定浏览器实现的内置类型的特权? 问题答案: 编辑: 自从编写了此答案以来,EcmaScript 5中

  • 目前,不允许在接口中使用get/set方法(访问器)。例如: 此外,TypeScript 不允许在类方法中使用数组函数表达式:例如: 有没有其他方法可以在接口定义上使用getter和setter?

  • 我想拆分我的验证器的声明和实现,与Spring boot环境中的这个问题非常相似。看起来好像是我让它几乎起作用了。我看到我的验证器实际上是由Spring验证调用的,但在执行验证后,Hibernate会抛出一个异常: 这是因为是一个接口(如预期)。 我已经这样配置了Spring(这是一个不同问题的答案): 我的自定义验证器: 所以它试图通过验证器名称找到一个Spring bean。所以我有一个验证器

  • 在静态编程语言接口中,属性是否使用空get/set语句声明有关系? 例如。。。 我很难注意到不同之处。 在实现接口时,我是否为属性使用getter/setters,或者我是否直接设置值似乎并不重要。 当通过java访问它们时,都有getters,都有getter和setters。

  • 我知道我也可以通过创建一个新文档,然后通过更新,但是这个方法需要2个写操作,而且速度也慢得多。