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

参考回答

在 TypeScript 中,gettersetter 是用于定义对象属性的特殊方法,它们使得在访问或修改对象的属性时能够控制行为。这些方法提供了一种封装机制,允许你在访问属性时加入额外的逻辑,而不需要直接操作字段。

详细讲解与拓展

  1. getter
    • getter 是一种用于读取对象属性的特殊方法。通过 getter,你可以在访问属性时执行一些自定义的代码,通常用于返回计算的值或执行某些操作。

    语法

    class MyClass {
       private _value: number;
    
       constructor(value: number) {
           this._value = value;
       }
    
       // getter
       get value(): number {
           return this._value;
       }
    }
    
    const obj = new MyClass(10);
    console.log(obj.value);  // 调用 getter,输出: 10
    

    在这个例子中,value 是一个 getter,当访问 obj.value 时,实际上是调用了 get value() 方法。

  2. setter

    • setter 是一种用于设置对象属性的特殊方法。通过 setter,你可以控制如何修改对象的属性值。例如,可以添加验证、计算或触发其他副作用。

    语法

    class MyClass {
       private _value: number;
    
       constructor(value: number) {
           this._value = value;
       }
    
       // getter
       get value(): number {
           return this._value;
       }
    
       // setter
       set value(newValue: number) {
           if (newValue < 0) {
               console.log("值不能小于 0");
           } else {
               this._value = newValue;
           }
       }
    }
    
    const obj = new MyClass(10);
    console.log(obj.value);  // 输出: 10
    
    obj.value = -5;  // 调用 setter,输出: 值不能小于 0
    console.log(obj.value);  // 输出: 10(没有被更新)
    
    obj.value = 20;  // 正常调用 setter
    console.log(obj.value);  // 输出: 20
    

    在这个例子中,value 是一个 setter,用于检查传入的值是否满足条件。如果值小于 0,则不会更新 _value

  3. gettersetter 的结合使用

    • 你可以在一个类中同时定义 gettersetter,这样既能控制属性的读取,也能控制属性的写入。这种方式使得类的属性访问更加灵活和可控。

    示例

    class Rectangle {
       private _width: number = 0;
       private _height: number = 0;
    
       // getter 和 setter 用于获取和设置 width 和 height
       get width(): number {
           return this._width;
       }
    
       set width(value: number) {
           if (value <= 0) {
               console.log("宽度必须大于零");
           } else {
               this._width = value;
           }
       }
    
       get height(): number {
           return this._height;
       }
    
       set height(value: number) {
           if (value <= 0) {
               console.log("高度必须大于零");
           } else {
               this._height = value;
           }
       }
    
       get area(): number {
           return this._width * this._height;
       }
    }
    
    const rect = new Rectangle();
    rect.width = 10;
    rect.height = 5;
    console.log(rect.area);  // 输出: 50
    
    rect.width = -1;  // 输出: 宽度必须大于零
    rect.height = 0;  // 输出: 高度必须大于零
    

    在这个例子中,widthheight 通过 setter 进行验证,确保它们是正数;area 是一个 getter,计算并返回矩形的面积。

  4. 使用 gettersetter 的好处

    • 封装性gettersetter 使得类的内部数据可以被安全地访问和修改。它们允许在属性访问时插入逻辑(如验证、计算等),而无需暴露内部实现细节。
    • 控制访问:你可以在 setter 中添加额外的逻辑来控制属性的值,例如进行验证、转换、记录日志等。getter 可以用于懒加载、计算值等场景。
  5. 只读属性
    • 如果你只希望属性是只读的,可以只定义 getter,没有 setter

    示例

    class Person {
       private _name: string;
    
       constructor(name: string) {
           this._name = name;
       }
    
       // 只读 getter
       get name(): string {
           return this._name;
       }
    }
    
    const person = new Person("John");
    console.log(person.name);  // 输出: John
    // person.name = "Doe";  // 错误: 'name' 是只读属性
    

总结
gettersetter 在 TypeScript 中用于控制对象属性的访问和修改,提供了更强的封装性和灵活性。getter 允许你在读取属性时执行额外逻辑,setter 允许你在修改属性时添加验证或其他副作用。通过合理使用 gettersetter,可以提升代码的可维护性、安全性和灵活性。

发表评论

后才能评论