代码之家  ›  专栏  ›  技术社区  ›  Lars Nyström

当我试图访问一个可能未定义的数组上的属性时,我怎么能让TypeScript出错呢?

  •  0
  • Lars Nyström  · 技术社区  · 5 年前

    我有一个类型为的变量 SomeObject[] | undefined 我正在访问 .length 属性,但TypeScript并没有警告我它可能未定义。以下是vscode的屏幕截图:

    Screenshot from VSCode

    正如你所看到的,没有红色的波浪线。

    我试图在TypeScript游乐场上重现这一点,但我做不到(它总是警告我该属性可能未定义)。

    我已经启用 strict , strictNullChecks , strictFunctionTypes , strictPropertyInitialization strictBindCallApply ,但我在这里找不到让TypeScript产生错误的选项。

    我需要启用哪个选项才能让TypeScript警告我该属性可能未定义?

    编辑: 由于有人添加了vscode标签,我还应该添加一点,即运行时没有错误或警告 tsc --noEmit -p . ,所以这与vscode无关。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Lars Nyström    5 年前

    所以我想出来了。这个故事有两个部分。

    我开始这场寻鹅游戏的原因是,当 .reports 财产是 undefined 但这里的问题不是TypeScript,而是我键入了来自服务器的响应,而没有实际验证数据的类型是否正确。所以,是的, .报告 未定义,但类型 .报告 说它不可能是未定义的。

    但Visual Studio Code表示,该属性可以 未定义 ?它是如何知道的,为什么在访问时没有警告我 .length 财产?

    事实证明,vscode类型提示是模糊的。它所说的是 表达 我徘徊的是 FilteredReport[] | undefined ,这与 财产 拥有那种类型(我不得不说,我真的认为他们在那里展示的是属性类型)。属性类型实际上只是 FilteredReport[] ,但由于可选的链接,表达式的计算结果可能为 已筛选报告[]|未定义 .

    我为vscode创建了一个关于工具提示的问题: https://github.com/microsoft/vscode/issues/94348