TypeScript版本: 2.3.2
代码
function foo<T>(t: T) {
let typeofT = typeof t;
if (typeofT === "function") {
t; // "t" is of type "T"
}
if (typeof t === "function") {
t; // "t" is of type "never"
}
}
预期行为:
"t"不应该被缩小为"never"
实际行为:
"t"被缩小为"never"
4条答案
按热度按时间fwzugrvs1#
第一个例子是因为TypeScript无法跟踪
typeofT
具有任何特殊含义,所以它对类型保护没有影响。更简单地重现这个错误的方法是:
如果你尝试调用
t
,实际上不会报错,所以这似乎更像是一个快速信息错误。1tu0hz3e2#
在我看来,这是一个错误。一个未受限制类型参数可以是任何东西,包括一个函数,所以将其缩小到
never
是不对的。我认为它应该是T & Function
,类似于我们如何生成T & string
如果你检查typeof t === "string"
。sg2wtvxw3#
调用
t()
是没问题的。但是,当我调用t.apply(...)
时,我仍然会得到一个错误:"Property 'apply' does not exist on type 'never'."
l2osamch4#
@Pc-lover 哎呀,#11412仍然是一个问题。我猜它真的是
never
类型,quickInfo是正确的。