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

为何ES2022目标下TypeScript可选类属性会被设为undefined?

TypeScript可选类属性在ES2021与ES2022编译目标下的差异解析

这确实是预期行为,核心原因是TypeScript在编译目标设为ES2022及以上时,会对齐ECMAScript 2022正式引入的**原生类字段(Class Fields)**规范。

不同编译目标的逻辑差异

  • ES2021及以下:
    ES2021及更早的JavaScript没有原生类字段语法,TypeScript会把类属性转换为构造函数内的赋值逻辑。对于未在构造函数中初始化的可选属性,TS不会在编译后的代码中为其添加任何赋值操作,因此这些属性不会出现在最终的实例对象上,就像你看到的输出只有已赋值的b。

    编译后的ES2021代码示例:

    "use strict";
    class A {
        constructor() {
            this.b = 'asd';
        }
    }
    console.log(new A());
    
  • ES2022及以上:
    ES2022原生支持类字段,TypeScript此时会直接使用原生类字段语法来编译类属性声明。根据原生规范,所有在类中声明的字段(包括可选属性),即使没有在构造函数中初始化,也会在实例化时被自动设置为undefined并添加到实例对象上,所以输出会包含a: undefined。

    编译后的ES2022代码示例:

    "use strict";
    class A {
        a;
        b;
        constructor() {
            this.b = 'asd';
        }
    }
    console.log(new A());
    

这个行为是TypeScript跟进ECMAScript标准的结果,属于规范对齐后的必然调整。

内容的提问来源于stack exchange,提问作者mrtnlrsn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:31:04