所以我刚才在回答这question个问题时,我发现了一些奇怪的东西,我找不到解释.
如果我们有一个泛型函数,并且参数是可选的,并且参数的类型使用泛型,则如下所示:
function ok<T>(thing?: T) {
}
然后,当我们try 将函数内的thing
缩小到只有T
时,显式判断它是否未定义:
thing !== undefined ? thing : 0;
// ^? T & ({} | null)
然后将thing
缩小到T & ({} | null)
.此外,当我们使用typeof
时,这将缩小到预期的T
.这也与If语句的行为相同.
typeof thing !== "undefined" ? thing : 0;
// ^? T
下面是minimal reproducible example分,上面有我提到的所有事情:
function ok<T>(thing?: T) {
thing !== undefined ? thing : 0;
// ^?
if (thing !== undefined) {
thing
// ^?
}
typeof thing !== "undefined" ? thing : 0;
// ^?
if (typeof thing !== "undefined") {
thing
// ^?
}
}
为何会是这样呢?这两种情况真的有我不知道的不同行为吗?这是个窃听器吗?我在为这一行为寻找一个解释.