如何修复TypeScript泛型toArray处理any类型返回非数组的问题
问题根因
你的泛型异常是TypeScript对any类型在条件类型中的特殊处理规则导致的:
- 常规的
T extends 条件 ? 真分支 : 假分支属于分布式条件类型,当待检查类型T为any时,TS不会走正常的匹配逻辑,而是直接返回真分支和假分支的联合类型 - 你的原
ToArr<any>实际计算结果为any | any[],而any和任意类型的联合最终都会被化简为any,因此出现了推导异常。
修复方案
只需要修改ToArr泛型的写法,将泛型和判断条件都包裹在元组中,规避分布式条件类型的any特殊处理,强制TS走严格结构匹配即可:
// 修改后的泛型定义 export type ToArr<T> = [T] extends [any[]] ? T : T[]; // 原有函数实现无需改动 export const toArray = <T>(arg: T): ToArr<T> => { return (Array.isArray(arg) ? arg : [arg]) as ToArr<T>; };
效果验证
修改后所有场景的推导都符合预期:
type testType1 = ToArr<string>; // string[] - 正常 type testType2 = ToArr<string[]>; // string[] - 正常 type testType3 = ToArr<any[]>; // any[] - 正常 type testType4 = ToArr<any>; // any[] - 符合预期 let myVar:any = 'test' let myVarArr = toArray(myVar) // 类型推导为any[],符合预期
内容的提问来源于stack exchange,提问作者Eliav Louski
相关产品推荐
相关产品推荐

