TypeScript如何从嵌套方法对象生成指定窄化联合类型
解决方案
直接通过 TypeScript 映射类型、模板字面量类型、内置工具类型组合实现,代码如下:
const Methods = { firstNamespace: { firstMethod: (p: string) => {}, secondMethod: (p: number, k: number) => {} }, secondNamespace: { firstMethod: (p: number) => {} } } type MethodsType = typeof Methods type GenerateMethodUnion<T> = { [NS in keyof T]: { [M in keyof T[NS]]: { method: `${string & NS}/${string & M}` payload: Parameters<T[NS][M]> } }[keyof T[NS]] }[keyof T] // 最终生成的类型和你预期的 Expected 完全等价 type Result = GenerateMethodUnion<MethodsType>
用到的核心类型特性
- 用
typeof从 JavaScript 运行时值提取对应的 TypeScript 类型定义 - 嵌套映射类型遍历两层对象的key,逐层生成对应方法的类型结构
- 模板字面量类型拼接命名空间名称与方法名,生成符合要求的
method字段字面量类型 - 内置工具类型
Parameters提取函数参数的类型元组,直接作为payload字段类型 - 索引访问语法
T[keyof T]将映射生成的对象值类型转换为联合类型,得到最终的窄化联合结构
如果需要支持更深层级的嵌套方法对象,可以把上面的工具类型改写成递归版本即可。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

