Как ответил @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!
}
}
Смотрите сами на детской площадке .