如何解决泛型类<T>无法作为ApiPath枚举键取值的问题?
问题:泛型类型与枚举键匹配时的报错修复
我定义了包含路由路径的ApiPath枚举:
export enum ApiPath { User = "/users", Property = "/properties", ... }
我在另一个类中用User接口调用GenericHttpClient,想要在GenericHttpClient类里实现泛型类型与枚举键的匹配,代码如下:
export class GenericHttpClient<T> extends HttpClient { async findOne(args: { id: string }): Promise<T> { const url = ApiPath[T]; // 此处无法正常运行 return await this.get<T>(`${url}/${args.id}`); } }
此时报错:'T' only refers to a type, but is being used as a value here. 请问有没有简便的修复方法?
修复方案
核心问题是泛型T是类型层面的标识,无法直接作为值去访问枚举的键,下面是两种简便的修复思路:
方案一:实例化时传入对应枚举值
把枚举的具体值(比如ApiPath.User)作为参数传入类的构造函数,让运行时能拿到明确的路由路径:
export class GenericHttpClient<T> extends HttpClient { private readonly basePath: string; constructor(basePath: ApiPath) { super(); this.basePath = basePath; } async findOne(args: { id: string }): Promise<T> { return await this.get<T>(`${this.basePath}/${args.id}`); } } // 使用示例 const userHttpClient = new GenericHttpClient<User>(ApiPath.User); const targetUser = await userHttpClient.findOne({ id: "u_123" });
方案二:方法调用时传入枚举键,同时做类型约束
通过类型约束让泛型和枚举键强关联,调用方法时传入枚举的键名,确保类型合法:
// 先提取枚举的键类型 type ApiPathKey = keyof typeof ApiPath; export class GenericHttpClient<T> extends HttpClient { async findOne(args: { id: string; key: ApiPathKey }): Promise<T> { const url = ApiPath[args.key]; return await this.get<T>(`${url}/${args.id}`); } } // 使用示例 const userHttpClient = new GenericHttpClient<User>(); const targetUser = await userHttpClient.findOne({ id: "u_123", key: "User" });
内容的提问来源于stack exchange,提问作者Alessandro Rhomberg
相关产品推荐
相关产品推荐

