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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:06:24