TypeScript中奇怪的可选类属性
突然从今天开始,下面的代码开始出现ts2322错误。
这在Typescript 操场上运行良好
我找不到任何问题,但有什么问题?
我正在使用 Visual Studio Code 1.56.2
class Klass {
value?: number;
constructor(value?: number) {
this.value = value;
}
}
回答
您还没有提到这一点,但我假设您正在使用 npm 中发布的夜间构建作为typescript@next. 如果是这样,您可能会看到 TypeScript 4.4 的新功能“严格可选属性”的预览,如在microsoft/TypeScript#43947 中实现的。(更新 2021-06-10)此功能最初将通过新的--strictOptionalProperties编译器标志启用,该标志将包含在--strict编译器选项套件中。但是,根据此注释,该标志将被重命名并从 中删除--strict,因此任何想要在 TypeScript 4.4 及更高版本中看到此行为的人都需要通过一些尚未确定名称的编译器标志手动启用它。
严格的可选属性将阻止您分配 undefined给可选属性,同时仍允许您读取 undefined此类属性。这更符合人们长期以来希望可选属性的方式,正如(现已最终关闭)问题microsoft/TypeScript#13195所证明的那样。
无论如何,这意味着将从可选参数读取的值分配给相同类型的可选属性不再安全,而不先检查它是否是undefined:
class Klass {
value?: number;
constructor(value?: number) {
if (value !== undefined) this.value = value;
}
}
Playground 链接到代码