如何使用 strictNullChecks 进行泛型类型推断以匹配限制较少的类型?

How to get generic type inference with strictNullChecks to match on less restrictive type?

我有一个带有两个参数的通用函数,其中一个是类型变量、null 和 undefined 的总和,另一个只是类型变量。 Typescript 正在从第二个参数推断类型变量。

我已经知道如何对此进行注释 - 使用 <> 显式设置类型变量或对第二个参数进行类型断言。

我正在考虑深入研究条件类型,看看它们是否可以过滤掉,但我不清楚它们是否可以。

const or = <T>(x: T|null|undefined, y:T): T =>
    x === null || x === undefined ? y : x;

const test: Map<string,number> = new Map();
const result = or(test.get('test'), 0);

我希望它进行类型检查,并且 result 应该具有类型 number - 相反我得到 "Type 'number' is not assignable to type '0 | null | undefined'.".

与某物列表和空列表一样,我知道某物不可分配给 never

我明白了。

const or = <T, S extends T>(x: T|null|undefined, y:S>: T =>
    x === null || x == undefined ? y : x;

我从一个稍微复杂一些的条件类型开始,然后意识到我可以将该假设转移到一个额外的类型参数中。