在布尔检查后传播联合类型中省略的类型

Propagate omitted types in union type after a boolean check

在打字稿中,将正确输入以下内容:

let v: number | null | undefined;

if(v === null || v === undefined) return;

// v is typed as `number`
const v2 = v + 2;

不过,假设我们为 nullundefined 检查创建了一个辅助函数。 Typescript 会抱怨这个:

let v: number | null | undefined;

const isNull = (v: number | null | undefined) => v === null || v === undefined;

if(isNull(v)) return;

// v is typed as `number | null | undefined` 
const v2 = v + 2;

有什么方法可以从辅助函数 isNull 向上传播 nullundefined 的相等性检查?

我想可以用 v! 覆盖它,但似乎 hacky/dangerous 因为现在两者是分离的。

您可以将 type predicate v is null | undefined 添加到 isNull

const isNull = 
    (v: number | null | undefined): v is null | undefined => v === null || v === undefined;

Playground