为何该TypeScript条件泛型类型无法正确收窄?
问题原因与解决方案
你写的这个泛型类型报错,核心原因是TypeScript对泛型参数的类型收窄逻辑和直觉预期不一样。
虽然你给T加了number[] | number的约束,但在条件类型T extends number ? T : T['length']里,false分支的T并没有被TypeScript明确认定为number[]。因为泛型参数是一个开放的变量,它可能是number | number[]这个联合类型本身,或者是某个同时兼容两种类型的边缘类型(实际场景少见,但TypeScript类型系统会考虑这种可能性),所以编译器不确定T一定有length属性,就抛出了错误。
解决办法
有两种简单的修复方式:
1. 调换条件判断顺序
先判断T是不是number[],这样true分支直接取length,false分支就是number,逻辑更清晰,编译器也能正确收窄类型:
type GetNum<T extends number[] | number> = T extends number[] ? T['length'] : T;
2. 用Extract明确提取类型
在false分支里,用Extract<T, number[]>把T中属于number[]的部分提取出来,再取length:
type GetNum<T extends number[] | number> = T extends number ? T : Extract<T, number[]>['length'];
内容的提问来源于stack exchange,提问作者mengjie guo
相关产品推荐
相关产品推荐

