Typescript - 错误地推断 'never'

标签 typescript type-inference

这是一个基本用例:用 null 初始化一个变量,然后在某个嵌套循环/函数中更改值:

let a: number | null = null;
[1].forEach(() => {
  a = 1;
});

if (a != null)
  a.toFixed(); // Error: Property 'toFixed' does not exist on type 'never'.

但是 typescript 将 a 的类型推断为 never。我会假设没有 if 它会假设它是 null | number 在这种情况下,我可能会收到一条错误消息,指出该属性在 null 上不存在,但为什么它假设它永远不会仅基于初始分配值。

我做错了什么吗?

最佳答案

如果您绝对确定 a 在那里有一个值,那么您可以将 ! 放在变量后面

let a: number | null = null;
[1].forEach(() => {
  a = 1;
});

if (a !== null)
  a!.toFixed(); //

我不会使用null,而是undefined,所以不需要使用!

let a: number | undefined;
[1].forEach(() => {
  a = 1;
});

if (a) { // <-- if undefined or 0
  a.toFixed(); // No problem here
}

同时建议使用 !== 而不是 !=

关于Typescript - 错误地推断 'never',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54769781/

相关文章:

c# - 是否可能有一个需要开放通用接口(interface)的通用约束?

java - 无法在不指定类型参数的情况下将 Java 8 方法与 lambda 参数一起使用

存在类型和类型成员的 Scala 类型推断

typescript - 无法使用 Material Design Lite 获取 aurelia 包

types - Ocaml 推理类型 int list 而不是 'a list

c++ - C++ 运算符重载中的类型推断

javascript - 由于奇怪的类型接口(interface),未解决推送方法

javascript - 更改窗口滚动上的 StencilJS 组件

angular - 如何将适用于 Javascript 的 TUI 图像编辑器导入到我的 Angular 应用程序中?

typescript - 如何在现有的 JavaScript 系统中慢慢迁移到/迁移到 TypeScript