使用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>(...)
?
答案 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
希望有所帮助;祝你好运!