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
相关产品推荐
相关产品推荐

