TypeScript如何提取对象所有属性下的嵌套actions属性类型
TypeScript提取嵌套对象actions子属性的强类型实现
你可以通过TypeScript内置的映射类型+索引访问类型实现这个需求,不需要额外依赖,推导结果完全匹配目标结构,且会保留所有方法的精确类型签名。
具体实现步骤
- 先定义通用的类型提取工具,约束传入的容器结构、遍历所有顶层属性,取每个属性下
actions字段的类型作为新类型对应键的值:
type ExtractActions<T extends Record<keyof T, { actions: unknown }>> = { [K in keyof T]: T[K]['actions'] }
- 借助
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
相关产品推荐
相关产品推荐

