TypeScript如何编写按入参是否为数组返回对应类型的条件类型
报错原因
TypeScript 暂不支持通过运行时的类型收窄逻辑(如Array.isArray(a))自动推导泛型条件类型的返回值,即使你的业务逻辑完全符合返回类型定义,也会触发类型不匹配的报错。
解决方案
方案1:使用函数重载(更推荐,可读性更高)
直接通过重载声明不同入参对应的返回类型,实现逻辑不需要额外处理:
// 重载签名:定义入参和返回值的对应关系 function test(a: number): string; function test(a: number[]): string[]; // 实现签名:类型覆盖所有重载的入参、返回值范围即可 function test(a: number | number[]): string | string[] { if (Array.isArray(a)) { return ['123', '45'] } return '123' }
调用后完全符合你的类型预期:
const a = test(3) // a 类型为 string const b = test([1,2,3]) // b 类型为 string[]
方案2:保留泛型写法,增加类型断言
如果不想用重载,确认业务逻辑没问题的前提下,可以直接给返回值加类型断言,告诉TS返回值符合定义:
// 抽离返回类型简化写法 type TestReturn<T> = T extends number[] ? string[] : string function test<T extends number | number[]>(a: T): TestReturn<T> { if (Array.isArray(a)) { return ['123', '45'] as TestReturn<T> } return '123' as TestReturn<T> }
内容的提问来源于stack exchange,提问作者sydd
相关产品推荐
相关产品推荐

