在 TypeScript 的接口中声明 getter/setter

在 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,因此它的nameage属性永远无法重新分配。

在我们的Developer类中,我们使用了一个
implements
子句来指示该类的类型
Person

我们
和属性使用了
getter
方法
,因此尝试更改它们的值会导致错误。
nameage

请注意,我们无法指明接口中的name属性将专门用作 getter。 agePerson

这被认为是一个实现细节,因为无论我们声明属性还是 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"

该类Developercountry一个 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 的原因是因为这被视为实现细节。