如何获取TypeScript嵌套对象中方法的参数类型?
嵌套对象方法参数类型推导问题
我需要推导如下嵌套对象中方法的参数类型:
const lightSwitch = { off: { switchOn: (state: Data, payload: number) => ({ ...state, state: 'on', meta: payload, }), }, on: { switchOff: (state: Data) => ({ ...state, state: 'off', }), }, };
期望得到的Params类型是:
{ 'switchOn': [state: Data, payload: number] 'switchOff': [state: Data] }
我的实现代码如下,但最终Params类型为空,请问原因是什么?该如何修正?
type Intersect<T> = T extends { [K in keyof T]: infer E } ? E : T; type Flattened = Intersect<typeof lightSwitch>; type Params = { [K in keyof Flattened]: Parameters<Flattened[K]> }; // type Params = {}
问题原因
你的Intersect类型逻辑错误。T extends { [K in keyof T]: infer E }这种写法会让TypeScript推断所有属性的公共类型,而非合并所有属性。typeof lightSwitch的off和on属性是完全不同的对象,它们的公共类型是{},因此Flattened最终为{},导致Params是空对象。
修正方案
方案一:递归提取所有层级的方法
如果嵌套层级不确定,递归类型可以适配任意深度的嵌套:
type ExtractMethods<T> = T extends Record<string, infer U> ? U extends (...args: any[]) => any ? { [K in keyof T]: Parameters<T[K]> } : ExtractMethods<U> : never; type Params = ExtractMethods<typeof lightSwitch>;
方案二:直接合并两层嵌套的属性
如果确定只有两层嵌套,直接通过索引访问合并更简洁:
type NestedMethods = typeof lightSwitch[keyof typeof lightSwitch]; type Params = { [K in keyof NestedMethods]: Parameters<NestedMethods[K]> };
两种方案最终都会生成你期望的Params类型:
{ switchOn: [state: Data, payload: number]; switchOff: [state: Data]; }
内容的提问来源于stack exchange,提问作者Andy Jessop
相关产品推荐
相关产品推荐

