TypeScript泛型类型异常表现:为何两种场景结果不同?
TypeScript条件类型差异原因解析
先看问题中的代码:
declare function f(fun: <T>(t: T) => void): void f((t) => { type T = typeof t type IsStringArray = T[] extends string[] ? true : false // false }) function g<T>(t: T) { type IsStringArray = T[] extends string[] ? true : false // T[] extends string[] ? true : false }
差异核心原因:泛型的实例化时机不同
1. 函数f的回调场景
函数f接收的参数是一个泛型函数类型<T>(t: T) => void。当传入匿名回调(t) => {...}时,TypeScript会对这个泛型回调进行即时实例化——因为没有显式指定泛型参数T,TS会把t推断为最宽泛的顶层类型unknown。
此时type T = typeof t得到的是具体类型unknown,代入条件类型后,unknown[] extends string[]的判断结果为false(unknown[]包含所有数组类型,并非仅string[]),所以IsStringArray直接被计算为false。
2. 函数g的内部场景
函数g本身是一个泛型函数,内部的IsStringArray是基于未实例化的泛型参数T定义的条件类型。在函数定义阶段,T还没有被具体类型替换(只有调用g并传入参数时,T才会确定),因此TS不会提前计算这个条件类型,而是保留它的原始形式T[] extends string[] ? true : false,等待后续调用时再做判断。
内容的提问来源于stack exchange,提问作者m-shaka
相关产品推荐
相关产品推荐

