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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:47:17