打字稿 - 错误地推断“从不”

use*_*467 6 type-inference typescript

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

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

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

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

难道我做错了什么?

dis*_*nte 7

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

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

if (a !== null)
  a!.toFixed(); //
Run Code Online (Sandbox Code Playgroud)

我不会使用null思想但是undefined,所以不需要使用!

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

if (a) { // <-- if undefined or 0
  a.toFixed(); // No problem here
}
Run Code Online (Sandbox Code Playgroud)

也作为建议使用!==!=