感谢
- 我承认,使用此模板的问题可能会在维护者的酌情决定下不经进一步解释而关闭。
评论
我不确定这是否是一个bug,但它似乎与泛型类型的不一致有关。
declare function f(fun: <T>(t: T) => void): void
f((t) => {
type T = typeof t
type IsAny = T extends any ? true: false // deferred
type IsAnyArray = T[] extends any[] ? true: false // return true
type IsString = T extends string ? true : false // deferred
type IsStringArray = T[] extends string[] ? true : false // return false
})
function g<T>(t: T) {
type IsAny = T extends any ? true: false // deferred
type IsAnyArray = T[] extends any[] ? true: false // return true
type IsString = T extends string ? true : false // deferred
type IsStringArray = T[] extends string[] ? true : false // deferred
}
我原以为 IsStringArray
会在传递给 f
的函数中被推迟,就像 g
的主体一样,但却被评估为 false
TS版本:5.5.3
重现代码:playground
(首先我在stackoverflow上提出了一个问题,但现在我认为这个问题更适合在这里提出)
1条答案
按热度按时间uxh89sit1#
这里的问题是我们没有考虑到通过上下文类型推断引入的类型参数,就像示例中的箭头函数那样。具体的逻辑在
getOuterTypeParameters
函数中。我会提交一个修复这个问题的 PR。请注意,这个问题还体现在上下文类型函数表达式和对象字面量方法中,以及除了数组类型之外的其他类型引用中。例如: