为什么TypeScript访问未定义的getter不触发编译错误而是返回undefined?
TypeScript仅定义属性setter的行为说明
在TypeScript中编写属性setter时,不需要同时定义对应的getter:
set name(name: string) { ... }
但当通过this.name访问未定义对应getter的属性时,不会触发编译时报错,运行时会返回undefined,但TypeScript会将该值的类型标记为setter接收的参数类型:
const theName = this.name; // 运行时返回undefined,但类型被标记为'string'
这种情况很容易在开发中意外出现,要是没有及时发现,会浪费大量开发时间。
这一设计决策的核心原因是TypeScript需要对齐JavaScript原生的属性定义行为,JS原生支持通过Object.defineProperty仅定义setter的属性:
Object.defineProperty(Dog.prototype, "name", { set: function (name) { }, enumerable: false, configurable: true });
如果要规避上述问题,标准的写法是同时定义对应的getter,通过私有属性存储属性值:
set name(name: string) { this._name = name; doNameStuff(name); } get name() { return this._name; } private _name!: string;
内容的提问来源于stack exchange,提问作者Simon_Weaver
相关产品推荐
相关产品推荐

