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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:30:03