TypeScript 中的 getter/setter 是什么?你如何使用它们?

在TypeScript中,getter和setter是类属性访问的特殊方法,允许你对类成员的读取和赋值进行更细致的控制。通过使用getter和setter,你可以在属性被访问或修改时执行额外的逻辑,比如验证数据、执行计算、触发事件等。

Getter

一个getter方法允许你定义一个“虚拟”属性,当这个属性被访问时,实际上执行的是一个方法。你可以使用get关键字来定义一个getter。

Setter

类似地,一个setter方法允许你定义当属性被赋值时执行的操作。你可以使用set关键字来定义一个setter。

使用Getter和Setter

下面是一个使用getter和setter的例子,假设我们有一个Person类,我们想要控制对firstNamelastName属性的访问,同时提供一个“虚拟”属性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返回一个由firstNamelastName组成的全名,setter则会解析输入的全名并设置firstNamelastName

好处

使用getter和setter的好处包括:

  • 封装性:你可以隐藏类的内部实现细节,只暴露通过getter和setter访问的接口。
  • 数据验证:在setter中,你可以添加验证逻辑来防止无效的数据被设置。
  • 附加逻辑:在访问或设置属性时,你可以执行额外的代码,比如日志记录或计算其他属性。

注意事项

虽然getter和setter提供了很好的封装和灵活性,但它们也可能使得你的代码更难理解和维护,特别是当它们包含复杂的逻辑时。因此,应当在确实需要时才使用它们。

发表评论

后才能评论