97

読み取り専用プロパティを持つインターフェイスを定義したいと思います。例えば;

interface foo {
    get bar():bool;
}

ただし、これにより、バーに「期待される ';'」という構文エラーが発生します。ES5 ターゲットを使用するように VisualStudio をセットアップしたので、ゲッターがサポートされています。これはインターフェイスの制限ですか? これは将来変更される可能性があります。それができるのはとてもいいことです。

4

3 に答える 3

21

はい、これはインターフェースの制限です。プロパティへのアクセスがゲッターで実装されているかどうかは実装の詳細であるため、パブリックインターフェイスの一部であってはなりません。この質問も参照してください。

インターフェイスで読み取り専用属性を指定する必要がある場合は、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 に答える