You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:12:42