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

TypeScript如何提取对象所有属性下的嵌套actions属性类型

TypeScript提取嵌套对象actions子属性的强类型实现

你可以通过TypeScript内置的映射类型+索引访问类型实现这个需求,不需要额外依赖,推导结果完全匹配目标结构,且会保留所有方法的精确类型签名。

具体实现步骤

  1. 先定义通用的类型提取工具,约束传入的容器结构、遍历所有顶层属性,取每个属性下actions字段的类型作为新类型对应键的值:
type ExtractActions<T extends Record<keyof T, { actions: unknown }>> = {
  [K in keyof T]: T[K]['actions']
}
  1. 借助typeof操作符从已定义的myContainer常量上拿到原始结构类型,传入工具类型即可得到目标MyActions类型:
const myContainer = {
    bla: {
        initialValue: 1,
        actions: { 
            clear: () => {},
            increase: () => {}
        }
    },
    foo: {
        initialValue: 'FOO',
        actions: {
            foo: () => {}
        }
    },
    third: {
        initialValue: 133,
        actions: {
            doNothing: () => {}
        }
    }
};

type MyActions = ExtractActions<typeof myContainer>

效果验证

推导得到的MyActions类型和你给出的目标结构完全一致:

  • 顶层保留bla/foo/third三个属性键
  • 每个键对应的类型就是原属性下actions对象的精确类型,所有方法签名都会被完整保留
  • 如果后续给任意属性的actions新增/删除方法,MyActions类型会自动同步更新,不需要手动维护

你可以通过如下代码验证类型正确性,不符合结构的赋值会直接触发TS类型报错:

// 赋值符合结构,无类型报错
const validActions: MyActions = {
  bla: {
    clear: () => {},
    increase: () => {}
  },
  foo: {
    foo: () => {}
  },
  third: {
    doNothing: () => {}
  }
}

如果你的myContainer在定义时出现类型拓宽导致方法类型丢失,可以在定义对象时末尾加上as const断言,即可锁定最精确的字面量类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:45:40