TypeScript泛型推断结果不符合预期,Result为何是unknown而非string?
问题解答
根本原因
你的代码返回unknown是TypeScript的infer关键字在泛型参数约束位置的推断规则导致的:
- 你代码中
infer R声明在泛型参数的约束位置(<G extends infer R>),TypeScript当前类型系统不会在泛型函数的结构化匹配过程中,主动提取目标泛型函数的参数约束绑定到infer声明的类型变量,这个场景下infer R没有匹配到显式的类型定义,就会降级为默认的unknown类型。 - 泛型函数的类型参数约束不属于函数结构化类型的校验范围:只要参数列表、返回值结构一致,即使泛型约束不同的两个函数,TypeScript也会判定为类型兼容,因此默认不会对约束部分做深度匹配提取。
可行的修正写法
如果需要提取到泛型参数的约束类型string,可以调整类型写法触发TS的实例化推断:
// 针对约束为string的场景 type GetFunctionGenerics<F> = F extends <G extends string>() => void ? string : never; // 通用提取任意约束的写法(TS 4.7及以上版本支持) type ExtractGenericConstraint<F> = F extends <G extends infer R>() => void ? [R] extends [unknown] ? never : R : never; type Result = ExtractGenericConstraint<<Y extends string>() => void>; // 此时Result类型为string
内容的提问来源于stack exchange,提问作者user17276502
相关产品推荐
相关产品推荐

