使用strictNullChecks推断通用函数中的类型

时间:2017-09-21 09:26:55

标签: typescript

使用typescript 2.5.2时,以下代码无法使用strictNullChecks进行编译:

function ifnull<T>(x: T | null | undefined, def: T): T
{
    return x != null ? x : def;
}

console.log(ifnull(2, 1));

给出错误:

Argument of type '2' is not assignable to parameter of type '1 | null | undefined'.

似乎它推断T为1而不是数字。在没有strictNullChecks的情况下编译时,它正确地推断出类型number。我没有足够的信心知道这是打字稿中的错误还是预期的行为,所以在填写错误报告之前我更愿意问这里。

这是预期的吗?严格推理的基本原理是什么,有没有办法定义ifnull而不必将其称为ifnull<number>(...)ifnull<string>(...)

1 个答案:

答案 0 :(得分:1)

严格推理的基本原理最好在this answer由TypeScript的核心贡献者@RyanCavanaugh解释。大多数情况下,您不希望TypeScript通过推断它们的并集来接受相同类型参数的两种不同类型。但是,我不知道为什么行为因strictNullChecks被关闭而有所不同。

你可以做的一件事就是delay第二个参数的推断,通过这样使用& {}

function ifnull<T>(x: T | null | undefined, def: T & {}): T
{
    return x != null ? x : def;
}

console.log(ifnull(2, 1)); // okay

希望有所帮助;祝你好运!