読み取り専用プロパティを持つインターフェイスを定義したいと思います。例えば;
interface foo {
get bar():bool;
}
ただし、これにより、バーに「期待される ';'」という構文エラーが発生します。ES5 ターゲットを使用するように VisualStudio をセットアップしたので、ゲッターがサポートされています。これはインターフェイスの制限ですか? これは将来変更される可能性があります。それができるのはとてもいいことです。
読み取り専用プロパティを持つインターフェイスを定義したいと思います。例えば;
interface foo {
get bar():bool;
}
ただし、これにより、バーに「期待される ';'」という構文エラーが発生します。ES5 ターゲットを使用するように VisualStudio をセットアップしたので、ゲッターがサポートされています。これはインターフェイスの制限ですか? これは将来変更される可能性があります。それができるのはとてもいいことです。
はい、これはインターフェースの制限です。プロパティへのアクセスがゲッターで実装されているかどうかは実装の詳細であるため、パブリックインターフェイスの一部であってはなりません。この質問も参照してください。
インターフェイスで読み取り専用属性を指定する必要がある場合は、getterメソッドを追加できます。
interface foo {
getAttribute() : string;
}
@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!
}
}
遊び場で自分の目で確かめてください。