97

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

interface foo {
    get bar():bool;
}

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

4

3 回答 3

124

Typescript 2.0中引入了 Getter-only 属性:

interface foo {
    readonly bar: boolean;
}
于 2017-04-13T11:09:04.467 回答
21

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

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

interface foo {
    getAttribute() : string;
}
于 2012-10-11T18:16:09.817 回答
5

正如@Vitaliy Ulantikov 回答的那样,您可以readonly在属性上使用修饰符。这就像一个吸气剂。

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

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

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

操场上亲自看看。

于 2018-09-14T05:03:53.170 回答