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

为何该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:27:15