TypeScript 中的 getter/setter 是什么?你如何使用它们?
在TypeScript中,getter和setter是类属性访问的特殊方法,允许你对类成员的读取和赋值进行更细致的控制。通过使用getter和setter,你可以在属性被访问或修改时执行额外的逻辑,比如验证数据、执行计算、触发事件等。
Getter
一个getter
方法允许你定义一个“虚拟”属性,当这个属性被访问时,实际上执行的是一个方法。你可以使用get
关键字来定义一个getter。
Setter
类似地,一个setter
方法允许你定义当属性被赋值时执行的操作。你可以使用set
关键字来定义一个setter。
使用Getter和Setter
下面是一个使用getter和setter的例子,假设我们有一个Person
类,我们想要控制对firstName
和lastName
属性的访问,同时提供一个“虚拟”属性fullName
:
class Person {
private _firstName: string;
private _lastName: string;
constructor(firstName: string, lastName: string) {
this._firstName = firstName;
this._lastName = lastName;
}
get firstName(): string {
return this._firstName;
}
set firstName(value: string) {
this._firstName = value;
}
get lastName(): string {
return this._lastName;
}
set lastName(value: string) {
this._lastName = value;
}
get fullName(): string {
return `{this._firstName}{this._lastName}`;
}
set fullName(name: string) {
const parts = name.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
}
}
const person = new Person("John", "Doe");
console.log(person.fullName); // John Doe
person.fullName = "Jane Doe";
console.log(person.firstName); // Jane
console.log(person.lastName); // Doe
在这个例子中,_firstName
和_lastName
是私有成员变量,它们通过公开的getter和setter进行访问和修改。这样,我们可以在setter中加入逻辑来验证或修改设置的值。fullName
是一个虚拟属性,没有对应的成员变量,它的getter返回一个由firstName
和lastName
组成的全名,setter则会解析输入的全名并设置firstName
和lastName
。
好处
使用getter和setter的好处包括:
- 封装性:你可以隐藏类的内部实现细节,只暴露通过getter和setter访问的接口。
- 数据验证:在setter中,你可以添加验证逻辑来防止无效的数据被设置。
- 附加逻辑:在访问或设置属性时,你可以执行额外的代码,比如日志记录或计算其他属性。
注意事项
虽然getter和setter提供了很好的封装和灵活性,但它们也可能使得你的代码更难理解和维护,特别是当它们包含复杂的逻辑时。因此,应当在确实需要时才使用它们。