TypeScript如何筛选返回值含body属性的方法键,解决类型索引报错
错误原因
原有工具类型仅筛选出了类中所有方法的键,没有额外约束这些方法的返回值必须包含body属性,因此TypeScript无法判定ReturnType<T[K]>一定可以用'body'作为索引访问,才会抛出该错误。
修改方案
你需要修改工具类型,在筛选方法的基础上,额外增加「方法返回值(异步方法需先解包Promise)包含body属性」的判断条件:
// 筛选:是函数 + 返回值(解包Promise后)包含body属性的键 type BodyFunctionPropertyNames<T> = { [K in keyof T]: T[K] extends (...args: any) => any ? Awaited<ReturnType<T[K]>> extends { body: any } ? K : never : never; }[keyof T]; // 提取符合要求的方法集合类型 export type OnlyBodyFunctionProperties<T> = Pick<T, BodyFunctionPropertyNames<T>>;
之后修改call函数的泛型约束即可:
public async call<K extends keyof OnlyBodyFunctionProperties<T>>( method: K, ...params: Parameters<T[K]> ): Promise<Awaited<ReturnType<T[K]>>['body']> { const response = {}; // 业务逻辑实现 return response as any; }
注:代码中用到的
Awaited是TypeScript 4.5+内置的工具类型,用于提取Promise的最终返回类型,如果你不需要兼容异步返回的方法,可以直接删除所有Awaited<>包裹。
内容的提问来源于stack exchange,提问作者Alburkerk
相关产品推荐
相关产品推荐

