为何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
相关产品推荐
相关产品推荐

