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

基于映射类型实现方法转Props?泛型无参方法选择的类型推导问询

实现泛型select函数:提取方法执行结果并保留类型

当然可以实现这个需求!咱们先梳理清楚核心诉求:

  • 约束输入的keys只能是原对象中无参方法的键
  • 返回的对象类型要准确对应每个方法执行后的返回值类型

第一步:定义筛选无参方法键的类型

首先我们需要一个工具类型,用来从对象类型T中筛选出那些值是无参函数的键:

type MethodKeys<T> = {
  [P in keyof T]: T[P] extends () => any ? P : never;
}[keyof T];

这个类型的逻辑是:遍历T的所有键,判断对应的值是否是无参函数,如果是就保留键名,否则返回never;最后通过[keyof T]提取所有有效键的联合类型。

第二步:实现带类型约束的select函数

接下来我们就可以写出符合要求的select函数了,利用TypeScript的ReturnType工具类型来提取每个方法的返回值类型:

function select<T, K extends MethodKeys<T>>(obj: T, keys: K[]): { [P in K]: ReturnType<T[P]> } {
  const result = {} as { [P in K]: ReturnType<T[P]> };
  keys.forEach(key => {
    result[key] = obj[key]();
  });
  return result;
}

这里的关键点:

  • 泛型K被约束为MethodKeys<T>,确保传入的keys只能是原对象中的无参方法键
  • 返回类型{ [P in K]: ReturnType<T[P]> }精确对应每个方法执行后的返回值类型
  • 函数内部通过类型断言as { [P in K]: ReturnType<T[P]> }告诉TypeScript我们构造的结果符合预期类型

第三步:测试示例

我们来写个测试代码验证一下效果:

// 定义一个包含不同无参方法的对象
const demoObj = {
  getUserName: () => "Alice",
  getUserAge: () => 25,
  getIsActive: () => true,
  // 非无参方法会被自动排除在可选keys之外
  getFullName: (firstName: string) => `${firstName} Smith`
};

// 选择指定方法,返回的对象类型会自动推导为 { getUserName: string; getUserAge: number }
const selected = select(demoObj, ["getUserName", "getUserAge"]);

console.log(selected.getUserName); // "Alice"
console.log(selected.getUserAge); // 25
// 如果尝试传入非无参方法的键(比如"getFullName"),TypeScript会直接报错

这样就完美实现了你想要的效果:不仅能正确执行方法并收集结果,还能在编译阶段保证类型安全,返回的对象类型完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:21:15