TypeScript 泛型函数如何实现类型到API端点字符串的自动映射
前提说明
TypeScript 的类型系统是静态编译期的,所有类型信息在编译为 JavaScript 后会被完全擦除,因此无法直接在运行时的泛型函数中读取泛型参数的类型名来查询映射,必须通过运行时可用的标识作为桥梁绑定类型与端点映射。
具体实现方案
1. 定义类型映射与对齐的运行时映射表
// 业务返回类型定义 interface FishToEat { count: number, fishType: string, } interface FruitToBuy { name: string, price: number } // 类型层面映射:key为自定义类型标识,value绑定对应返回类型与端点 type TypeEndpointMap = { FishToEat: { returnType: FishToEat, endpoint: "/fishes" }, FruitToBuy: { returnType: FruitToBuy, endpoint: "/fruits" } } // 运行时映射对象,与上面的类型严格对齐,TS会自动校验匹配性 const runtimeEndpointMap: {[K in keyof TypeEndpointMap]: TypeEndpointMap[K]['endpoint']} = { FishToEat: "/fishes", FruitToBuy: "/fruits" }
2. 改造泛型请求函数
function getValue<K extends keyof TypeEndpointMap>(typeKey: K): TypeEndpointMap[K]['returnType'] { // 直接从运行时映射表获取对应端点,无需手动传端点参数 const endpoint = runtimeEndpointMap[typeKey] // 此处编写实际的接口请求逻辑 return {} as TypeEndpointMap[K]['returnType'] }
3. 调用示例
// 只需传类型标识,无需传端点,TS自动推导返回值为FishToEat强类型 const myvalue = getValue("FishToEat") // 可直接访问 myvalue.count、myvalue.fishType 等类型属性
方案说明
该实现完全满足需求:
- 无需手动传入端点参数,端点统一在映射表维护
- 全程强类型校验,类型标识写错、映射表不匹配都会触发TS编译报错
- 返回值类型自动推导,无需手动声明泛型
注意:不存在完全不传入任何运行时参数、仅靠泛型获取端点的实现方案,这是TypeScript类型擦除机制决定的,无绕过可能。
内容的提问来源于stack exchange,提问作者scotcoder
相关产品推荐
相关产品推荐

