可以在TypeScript接口中使用getter/setter吗?

可以在TypeScript接口中使用getter/setter吗?,typescript,Typescript,我想定义一个具有只读属性的接口。比如, interface foo { get bar():bool; } 但是,这会在条上出现语法错误“应为“;”。我已将VisualStudio设置为使用ES5目标,因此支持getter。这是接口的限制吗?这可能会在未来发生变化;这是一件非常好的事情。是的,这是对接口的限制。是否使用getter实现对属性的访问是一个实现细节,因此不应该是公共接口的一部分。另见 如果需要在接口中指定只读属性,可以添加getter方法: interface foo {

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

interface foo {
    get bar():bool;
}

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

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

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

interface foo {
    getAttribute() : string;
}

仅Getter属性在中引入:


正如@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!
    }
}

请参见。

请参见是,这是接口的限制。另见[本问题][1]。[1] 这回答了你的问题吗?不幸的是,它不是只读的实现细节。我希望我能用打字稿来表达,我明白了。那么我认为您唯一的方法就是指定一个getter方法。我已经相应地更新了我的答案。大概在TypeScript 2.0中这将成为可能:如果我没有弄错的话,这仍然将
bar
声明为属性,而不是getter。@AlexanderAbakumov readonly没有指定它必须是属性。由于属性的引用方式与getter相同,因此实现此接口的类可以自由使用属性或getter。@nikeee:是的,但OP询问我们是否可以在接口中使用getter/setter,而不是属性。@AlexanderAbakumov但这就是getter。如果尝试分配给属性,则会出现此错误
错误TS2540(TS)无法分配给“bar”,因为它是常量或只读属性。
这是只读属性,而不是getter。如图所示,有一点不同:属性:只读条:布尔getter:get-bar():布尔{返回a&&b | | c&!e | | |(x | y | z)}
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!
    }
}