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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:06:07