首页 > 解决方案 > TypeScript 中奇怪的可选类属性

问题描述

突然从今天开始,下面的代码开始出现ts2322错误。
这在Typescript 操场上效果很好

我找不到任何问题,但问题是什么?

我正在使用 Visual Studio Code 1.56.2

class Klass {
  value?: number;

  constructor(value?: number) {
    this.value = value;
  }
}

在此处输入图像描述

标签: typescript

解决方案


您还没有提到这一点,但我假设您正在使用在 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 代码链接


推荐阅读