TypeScript中未知类型的通用API响应解析方案探究
解决方案:通过元数据配置实现通用API响应解析函数
首先明确:TypeScript的类型仅存在于编译阶段,运行时会被完全擦除,所以无法直接遍历T类型的属性。但我们可以通过传入「类型的运行时元数据」,配合泛型函数来实现通用的解析逻辑,彻底避免重复编写校验代码。
具体实现步骤
1. 定义类型校验器的通用结构
先创建一套类型,用来描述每个属性对应的校验规则:
// 单个属性的校验器类型:接收未知值,返回是否符合目标类型的断言 type PropertyValidator<T> = (value: unknown) => value is T; // 目标类型的校验器配置:键是类型的属性名,值是对应属性的校验函数 type TypeValidator<T> = { [K in keyof T]: PropertyValidator<T[K]>; };
2. 编写通用的泛型解析函数
基于上面的校验器配置,编写通用解析函数,它会遍历配置中的属性,逐一校验响应数据的字段:
function parseApiResponse<T>(res: unknown, validator: TypeValidator<T>): T | null { // 先做基础校验:必须是非空对象 if (typeof res !== 'object' || res === null) { return null; } const result = {} as T; // 遍历校验器配置的每个属性,逐一校验赋值 for (const key in validator) { const rawValue = (res as Record<string, unknown>)[key]; // 检查属性是否存在且不为null/undefined if (rawValue == null) { return null; } // 用对应校验函数校验类型 const validate = validator[key]; if (!validate(rawValue)) { return null; } // 校验通过后赋值到结果对象 result[key] = rawValue as T[keyof T]; } return result; }
3. 为目标类型创建校验器配置
针对你的ExpectedReturnType,编写对应的校验器配置:
type ExpectedReturnType = { a: string; b: number; c: boolean; }; // 为每个属性定义具体的校验逻辑 const expectedReturnTypeValidator: TypeValidator<ExpectedReturnType> = { a: (value): value is string => typeof value === 'string', b: (value): value is number => typeof value === 'number', c: (value): value is boolean => typeof value === 'boolean', };
4. 使用通用解析函数
现在就可以用这个通用函数解析API响应,不用再重复写冗余的校验代码:
// 示例调用 const apiResponse = { a: 'str', b: 1, c: true }; const parsedResult = parseApiResponse(apiResponse, expectedReturnTypeValidator); // parsedResult 的类型自动推导为 ExpectedReturnType | null
进阶优化
如果觉得每个类型都写校验器配置麻烦,可以:
- 封装常用类型的校验函数(比如
isString、isNumber),复用代码 - 针对嵌套对象类型,编写递归生成校验器的逻辑
- 结合类装饰器,在类定义时自动生成校验器(适合用类来定义API响应类型的场景)
内容的提问来源于stack exchange,提问作者Stanton
相关产品推荐
相关产品推荐

