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

TypeScript函数如何根据参数返回对应单一类型而非联合类型

问题描述

原本有一个签名固定为getData: () => string[]的API调用函数getData,需要为其添加可选的process处理器函数,需求如下:

  • 不传process时,返回string[]类型
  • 传入process时,返回该函数指定的T类型

但修改后的函数在调用getData()时,返回值类型被推断为unknown,相关代码示例如下:

原函数:

async function getData(){
   const response = await fetchData()
   return response
}

修改后的函数:

async function getData<T>(process?: (data: Awaited<ReturnType<typeof fetchData>>) => T){
   const response = await fetchData()
   return process ? process(response) : response
}

调用时的类型问题:

const result = await getData()
        ^
    unknown type
解决方案

问题根源在于泛型T未设置默认值,当不传入process时,TypeScript无法自动推断T的类型,会默认将其设为unknown。只需给泛型T指定默认类型——也就是原函数的返回类型Awaited<ReturnType<typeof fetchData>>(即string[]),就能解决类型推断问题。

修改后的正确代码:

async function getData<T = Awaited<ReturnType<typeof fetchData>>>(
  process?: (data: Awaited<ReturnType<typeof fetchData>>) => T
) {
  const response = await fetchData()
  return (process ? process(response) : response) as T
}

如果明确知道fetchData返回的是Promise<string[]>,也可以直接将默认类型设为string[],代码更简洁:

async function getData<T = string[]>(process?: (data: string[]) => T) {
  const response = await fetchData()
  return (process ? process(response) : response) as T
}

调整后调用效果:

  • const result = await getData():result类型自动推断为string[]
  • const numResult = await getData(data => data.length):numResult类型自动推断为number

内容的提问来源于stack exchange,提问作者howard wolowitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:07:07