Som @Vitaliy Ulantikov besvart, kan du bruke readonlymodifier på en eiendom. Denne fungerer akkurat som en getter.
interface Point {
readonly x: number;
readonly y: number;
}
Når et objekt bokstavelig implementerer grensesnittet, kan du ikke overskrive en readonlyeiendom:
let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!
Men når en klasse implementerer grensesnittet, er det ingen måte å unngå å overskrive den.
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!
}
}
Jeg antar det er fordi når du re-erklære eiendommer i klassen definisjonen, de overstyre egenskapene til grensesnittet, og er ikke lenger skrivebeskyttet.
For å fikse det, kan du bruke readonlypå eiendommene direkte i klasse som implementerer grensesnittet
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!
}
}
Se selv i lekeplassen .