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

TypeScript如何根据动态字符串转换API响应类型

解决TypeScript动态匹配API响应类型的问题

要实现调用请求函数时,根据传入的类型字符串自动匹配对应返回类型,需要从类型约束和泛型推断两方面调整代码:

1. 定义合法的请求参数类型

首先约束apiType必须是ResponseTypes中存在的类型键,确保传入的类型字符串合法:

import * as ResponseTypes from './types';

// 约束apiType只能是ResponseTypes中已定义的类型键
type RequestObj = {
  APIURL: string;
  apiType: keyof typeof ResponseTypes;
};

2. 给request函数添加泛型绑定

通过泛型将apiType的类型和返回值类型关联,让TypeScript能准确推断返回类型:

export const request = async <T extends keyof typeof ResponseTypes>({ APIURL, apiType }: RequestObj) => {
  // 补充原代码缺失的headers和postBody定义(根据实际业务调整)
  const headers = { 'Content-Type': 'application/json' };
  const postBody = {};

  return fetch(`${APIURL}/`, {
    method: 'POST',
    headers,
    body: JSON.stringify(postBody),
  })
    .then((response) => {
      // 增加响应状态校验,避免无效数据流入后续逻辑
      if (!response.ok) {
        throw new Error(`请求失败:${response.status}`);
      }
      return response.json();
    })
    .then((responseJson) => {
      // 类型断言为指定的ResponseTypes成员
      return responseJson as ResponseTypes[T];
    })
    .catch((error) => {
      console.error('请求捕获错误', error);
      throw error; // async函数直接抛出错误即可,无需Promise.reject
    });
};

3. 调用时的自动类型推断

现在调用request时,传入合法的apiType字符串,TypeScript会自动推断返回值的类型:

// 调用示例
const userData = await request({ APIURL: '..api.com/user', apiType: 'UserType' });
// userData会被自动推断为ResponseTypes.UserType类型,可直接访问对应属性
const email = userData.email;

关键说明

  • 泛型T绑定了apiType的类型,确保返回值类型和传入的类型字符串严格对应;
  • keyof typeof ResponseTypes限制了apiType的可选值,避免传入不存在的类型字符串;
  • 原代码中冗余的Promise.resolve/Promise.reject可简化,因为async函数本身会返回Promise。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:00:28