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来处理的,而非直接操作实例上的字段。
为什么要用它?和普通属性的差异在哪?
封装性与扩展性拉满
如果你后续想给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,还得同步修改所有外部调用的地方。底层属性类型本质不同
你可以通过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
相关产品推荐
相关产品推荐

