TypeScript 快速信息显示缩小到函数的变量从未显示过,

gxwragnw  于 4个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(121)

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"

fwzugrvs

fwzugrvs1#

第一个例子是因为TypeScript无法跟踪typeofT具有任何特殊含义,所以它对类型保护没有影响。
更简单地重现这个错误的方法是:

function foo(t: {}) {
    if (typeof t === "function") {
        t; // Hover shows `t: never`
    }
}

如果你尝试调用t,实际上不会报错,所以这似乎更像是一个快速信息错误。

1tu0hz3e

1tu0hz3e2#

在我看来,这是一个错误。一个未受限制类型参数可以是任何东西,包括一个函数,所以将其缩小到 never 是不对的。我认为它应该是 T & Function ,类似于我们如何生成 T & string 如果你检查 typeof t === "string"

sg2wtvxw

sg2wtvxw3#

调用 t() 是没问题的。但是,当我调用 t.apply(...) 时,我仍然会得到一个错误:
"Property 'apply' does not exist on type 'never'."

l2osamch

l2osamch4#

@Pc-lover 哎呀,#11412仍然是一个问题。我猜它真的是never类型,quickInfo是正确的。

相关问题