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

如何从函数参数推导类型?优化createApi的类型推断

TypeScript自动推断createApi函数的端点类型问题解决方案

原代码中createApi无法正确推断端点的Input和Resp类型,核心原因是泛型约束过于宽泛,导致TypeScript无法从传入的配置中提取具体类型信息。以下是修复后的实现:

修复后的完整代码

export interface Http {
  get: <T>(url: string) => Promise<T>
}

export type RequestConfig<Input, Resp> = {
  query: (input: Input) => Promise<Resp>
}

// 调整EndpointConfig的泛型定义,让TypeScript能反向推断Input和Resp
export type EndpointConfig<Input = unknown, Resp = unknown> = (http: Http) => RequestConfig<Input, Resp>

// 重新定义ApiConfig,直接映射端点的实际类型
export type ApiConfig<E extends Record<string, EndpointConfig>> = {
  endpoints: E
}

// 修改createApi的泛型,让它自动推断传入的端点配置类型
export const createApi = <E extends Record<string, EndpointConfig>>(config: ApiConfig<E>): ApiConfig<E> => {
  // 实际实现逻辑
  return config;
};

// ============ 使用示例 ============

interface User {
  username: string
}

export const api = createApi({
  endpoints: {
    users: http => ({
      query: (input: string) => http.get<User>(`/users/${input}`),
    }),
    getPosts: http => ({
      query: (input: { userId: number }) => http.get<{ id: number; title: string }[]>(`/users/${input.userId}/posts`),
    })
  },
});

const { users, getPosts } = api.endpoints;
// typeof users: EndpointConfig<string, User>
// typeof getPosts: EndpointConfig<{ userId: number }, { id: number; title: string }[]>

关键改动说明

  1. 简化泛型约束:移除了原有的EndpointMap类型,改用Record<string, EndpointConfig>作为泛型约束,让TypeScript可以直接从传入的端点函数中推断Input和Resp的具体类型。
  2. 调整EndpointConfig的默认泛型:给Input和Resp设置默认值unknown,避免未指定类型时直接退化为any。
  3. 让createApi直接推断输入类型:泛型参数E直接对应传入的endpoints对象类型,返回类型与输入类型完全一致,确保类型推断的准确性。

这样修改后,TypeScript就能正确识别每个端点的输入和返回类型,满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:23:43