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

从联合类型提取get开头可调用键时遇unknown无调用签名问题

解决遗留函数entityGetter的TypeScript类型问题

核心思路

通过自定义类型工具筛选合法的get方法名,结合泛型约束让TypeScript自动推导返回类型,同时用类型断言消除调用错误。

实现步骤

  1. 定义类型工具筛选get方法
    创建GetterKeys<T>类型,自动提取对象类型中以get开头的可调用方法名:
type GetterKeys<T> = keyof {
  [K in keyof T as T[K] extends (...args: any[]) => any 
    ? K extends `get${string}` ? K : never 
    : never]: T[K]
};
  1. 重构函数类型定义
    用泛型约束实体类型和action参数,同时推导返回类型:
// 替换成你实际的实体类型定义
type TEntityA = {
  getId: () => number;
  getName: () => string;
  setName: (name: string) => void; // 非get方法会被自动排除
};

type TEntityB = {
  getStatus: () => 'active' | 'inactive';
  getMetadata: (key: string) => string | null;
  update: () => void; // 非get方法会被自动排除
};

function entityGetter<T extends TEntityA | TEntityB, A extends GetterKeys<T>>(
  entity: T,
  action: A
): ReturnType<T[A]> {
  // 类型断言明确告诉TypeScript:entity[action]是可调用函数
  const getter = entity[action] as (...args: Parameters<T[A]>) => ReturnType<T[A]>;
  // 根据实际业务逻辑调整调用方式,这里以无参为例
  return getter();
}

效果验证

  • action参数仅允许传入以get开头的方法名,非法参数会被TypeScript即时拦截
  • 返回类型自动推导为对应get方法的返回值类型,不再是any
  • 彻底消除"This expression is not callable. Type 'unknown' has no call signatures."错误

注意事项

  • 若你的get方法需要接收参数,直接在调用getter()时传入对应参数即可,TypeScript会自动校验参数类型
  • 完全保留原函数的运行时调用接口,无需修改外部调用逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:42:28