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
相关产品推荐
相关产品推荐

