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

TypeScript中如何基于手动构造的对象字面量提取类型?

当然可以实现!这在TypeScript里完全行得通,核心思路是利用TypeScript的条件类型和映射类型,从对象字面量中提取并转换我们需要的类型结构。下面一步步拆解实现方法:

实现步骤与代码示例

1. 先修正原代码的类型定义

首先你原代码里makeFunc的类型标注有点问题——你把它标注成了一个对象类型,但实际它是一个泛型函数。先把它调整成正确的形式,这样TypeScript才能正确推导后续的类型:

// 定义makeFunc为泛型函数:接收TParam类型的参数,返回一个接收TParam并返回TResult的函数
const makeFunc = <TParam, TResult>(p: TParam): (param: TParam) => TResult => {
  // 这里替换为你实际的doSomething逻辑
  return (param: TParam) => doSomething(param);
};

2. 编写类型提取工具

接下来我们需要一个工具类型,它会遍历对象的每个属性,把属性值的函数类型提取出来(或者按需转换)。这里用映射类型遍历对象键,再用条件类型提取函数的参数和返回值:

// 工具类型:提取对象中每个函数属性的完整类型
type ExtractFunctionTypes<T> = {
  [K in keyof T]: 
    T[K] extends (p: infer ParamType) => infer ReturnType 
      ? (p: ParamType) => ReturnType 
      : never;
};

这个工具的逻辑很简单:对对象T的每一个键K,检查对应的属性是不是函数;如果是,就自动提取它的参数类型ParamType和返回值类型ReturnType,然后构造出我们需要的函数类型。

3. 提取目标类型

现在当你创建好myObj之后,只需要用这个工具类型,基于typeof myObj就能得到你想要的结构:

// 假设A、B、AR、BR是已定义的类型,a和b是对应类型的实例
const a: A = /* 你的a实例 */;
const b: B = /* 你的b实例 */;

// 创建对象字面量
const myObj = {
  getSomething: makeFunc(a),
  getSomethingElse: makeFunc(b)
};

// 提取我们需要的类型
type extractedType = ExtractFunctionTypes<typeof myObj>;

此时extractedType的结构就和你期望的完全一致:

interface extractedType {
  getSomething: (a: A) => AR;
  getSomethingElse: (b: B) => BR;
}

额外小贴士

如果makeFunc的返回类型有更复杂的结构(比如不是单纯的函数,而是包含多个属性的对象),你可以修改ExtractFunctionTypes里的条件逻辑,用同样的思路提取你需要的部分——TypeScript的类型系统在这类场景下灵活性非常高。

内容的提问来源于stack exchange,提问作者Charles Prakash Dasari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:39:06