TypeScript如何实现支持默认返回类型的条件泛型解析函数
TypeScript 泛型函数双调用模式实现方案
要实现「无泛型调用返回默认类型、传泛型调用返回指定类型」的需求,核心是给泛型参数设置默认类型值,配合可选的类型约束即可,不需要额外写函数重载。
实现代码
首先保留已有的基础类型定义:
type TApiResponse = {/* 复杂非结构化原始响应数据 */} type TParsedResponse = {[key:string]: string | number}[] // 通用解析结果结构 type TSpecificParsedResponse = {name:string, age:number}[] // 业务自定义解析结果结构
函数的正确类型标注如下:
const parseApiResponse = <T extends TParsedResponse = TParsedResponse>( apiResponse: TApiResponse ): T => { // 这里编写实际的响应解析逻辑 const parsedResponse = /* 解析逻辑产出的结果 */; return parsedResponse as T; };
调用效果验证
两种调用方式都能得到符合预期的类型推导:
- 直接调用不传泛型参数:
const res = parseApiResponse(rawApiResponse),此时TS自动使用泛型默认值,res的类型为TParsedResponse - 显式传入自定义泛型:
const res = parseApiResponse<TSpecificParsedResponse>(rawApiResponse),此时res的类型为指定的TSpecificParsedResponse,可以直接访问res[0].name、res[0].age属性,不会触发类型报错
额外说明
- 泛型里的
extends TParsedResponse是可选的类型约束,作用是防止传入和基础解析结果结构完全不兼容的类型(比如传入string、number这类非对象数组类型),如果不需要这类强校验,可以去掉extends部分,直接写<T = TParsedResponse> - 原有写法的问题在于没有给泛型设置默认值,直接调用时TS无法推断
T的实际类型,会回退到unknown,拿不到默认的TParsedResponse类型。
内容的提问来源于stack exchange,提问作者moroncodes
相关产品推荐
相关产品推荐

