在 TypeScript 的接口中声明 getter/setter
Declaring getters/setters in Interfaces in TypeScript
使用readonly
修饰符在接口中声明一个 getter,例如
interface Person {readonly name: string;}
. 接口的消费者将只能读取该属性,但他们希望能够重新分配它。
索引.ts
interface Person { readonly name: string; readonly age: number; } const dev1: Person = { name: 'Alice', age: 29, }; console.log(dev1.name); // 👉️ "Alice" // ⛔️ Error: Cannot assign to 'name' because // it is a read-only property. ts(2540) dev1.name = 'Anne'; class Developer implements Person { get name() { return 'Bob'; } get age() { return 30; } } const dev2 = new Developer(); console.log(dev2.name); // 👉️ "Bob" // ⛔️ Error: Cannot assign to 'name' because // it is a read-only property. dev2.name = 'Carl';
示例中的Person
接口有 2 个
用作 getter 的只读属性。
该dev1
对象的类型为Person
,因此它的name
和age
属性永远无法重新分配。
在我们的Developer
类中,我们使用了一个
implements
子句来指示该类的类型Person
。
我们
对和属性使用了getter
方法,因此尝试更改它们的值会导致错误。name
age
请注意,我们无法指明接口中的
name
和属性将专门用作 getter。 age
Person
这被认为是一个实现细节,因为无论我们声明属性还是 a 都不重要getter
,只要访问属性返回正确类型的值即可。
从技术上讲,实现接口的类可以自由使用属性或 getter。
同样,我们无法在接口中指定属性是 setter,但我们仍然可以在我们的类中使用 setter。
索引.ts
interface Person { country: string; } class Developer implements Person { private _country = ''; get country() { return this._country; } set country(c: string) { this._country = c; } } const dev = new Developer(); console.log(dev.country); // 👉️ "" dev.country = 'Germany'; console.log(dev.country); // 👉️ "Germany"
该类Developer
有country
一个 getter 和 setter 属性。
请注意,如果您仅为getter
特定类属性声明 a,该属性会自动标记为readonly
.
您也不需要指定 setter 参数的类型。如果你没有明确指定它,它是从 getter 的返回类型推断出来的。
索引.ts
interface Person { country: string; } class Developer implements Person { private _country = ''; get country() { return this._country; } // 👇️ (parameter) c: string (It's inferred) // from the return type of the getter set country(c) { this._country = c; } } const dev = new Developer(); console.log(dev.country); // 👉️ "" dev.country = 'Germany'; console.log(dev.country); // 👉️ "Germany"
与 getter 一样,类不需要为country
属性使用 getter 和 setter。
索引.ts
interface Person { country: string; } class Developer implements Person { public country = ''; } const dev = new Developer(); console.log(dev.country); // 👉️ "" dev.country = 'Germany'; console.log(dev.country); // 👉️ "Germany"
我们使用了一个基本的类属性,我们仍然正确地实现了接口。
我们无法指定接口中的特定属性是 getter 或 setter 的原因是因为这被视为实现细节。