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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 10:45:04