You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中`accessor`关键字的作用及使用疑问咨询

TypeScript中accessor关键字的作用及使用疑问咨询

嗨,我来帮你理清TypeScript里accessor关键字的作用~你说调用new Example().value看起来和普通属性没区别,其实这正是它设计的巧妙之处,下面给你掰扯清楚:

首先,accessor是TypeScript 4.9+引入的语法糖

它的核心作用是快速生成带有getter和setter的访问器属性,而非普通的实例数据属性。你写的这段代码:

class Example {
  accessor value: number;
}

TypeScript会自动把它编译成类似这样的JavaScript代码:

class Example {
  // 生成私有字段存储实际值
  #value;
  // 自动生成getter方法
  get value() {
    return this.#value;
  }
  // 自动生成setter方法
  set value(v) {
    this.#value = v;
  }
}

所以表面上你用new Example().value读写和普通属性一模一样,但底层已经是通过getter/setter来处理的,而非直接操作实例上的字段。

为什么要用它?和普通属性的差异在哪?

  1. 封装性与扩展性拉满
    如果你后续想给value的读写加逻辑(比如参数校验、读写日志),完全不需要修改外部的调用代码,直接在类里重写getter/setter就行:

    class Example {
      accessor value: number = 0;
    
      get value() {
        console.log("正在读取value的值");
        return this.#value;
      }
    
      set value(v: number) {
        if (v < 0) {
          console.warn("value不能为负数,将自动设为0");
          this.#value = 0;
        } else {
          this.#value = v;
        }
      }
    }
    

    外部依然可以用example.value = -5或者console.log(example.value)来调用,丝毫不用改代码——这比普通属性灵活太多,普通属性如果要加这类逻辑,你得把它改成手动的get/set,还得同步修改所有外部调用的地方。

  2. 底层属性类型本质不同
    你可以通过Object.getOwnPropertyDescriptors直观看到区别:

    // 普通属性类
    class NormalClass {
      value: number = 0;
    }
    // accessor属性类
    class AccessorClass {
      accessor value: number = 0;
    }
    
    const normalInst = new NormalClass();
    const accessorInst = new AccessorClass();
    
    console.log(Object.getOwnPropertyDescriptors(normalInst));
    // 输出的value是「数据属性」,包含value、writable、enumerable、configurable字段
    
    console.log(Object.getOwnPropertyDescriptors(accessorInst));
    // 输出的value是「访问器属性」,包含get、set、enumerable、configurable字段,没有value字段
    

最后再总结下

accessor关键字就是帮你少写重复的getter/setter代码,同时给属性的读写逻辑留好扩展空间——表面调用方式和普通属性一致,但底层已经是更灵活的访问器模式,特别适合那些现在看起来是普通属性,但未来可能需要加校验、转换逻辑的场景。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:09:32