如何通过泛型实现基于外部对象的可复用TypeScript类型生成?
基于传入对象生成自定义TypeScript类型的复用方案
问题背景
编写TypeScript Hook时,需要根据外部传入的对象生成特定结构的自定义类型:每个键对应的值为key_keyof Object[key]的联合类型。目前已能针对单个对象实现类型转换,但希望通过泛型或函数实现逻辑复用,避免重复编写代码。
示例
输入对象:
const demoObj = { test: { '1': '', '2': '' }, test1: { '3': '', '4': '' } }
期望生成的类型:
type ExpectedType = { 'test': 'test_1' | 'test_2', 'test1': 'test1_3' | 'test1_4' }
当前实现(仅针对特定对象)
type Keys = keyof typeof demoObj type Values = { [key in Keys]: keyof typeof demoObj[key] } type ExpectedType = { [key in keyof Values]: `${key}_${Values[key]}` }
解决方案:泛型封装类型逻辑
可以通过泛型类型直接封装转换逻辑,实现对任意符合结构的对象的类型复用:
1. 定义泛型类型
type GenerateKeyCombinedType<T extends Record<string, Record<string, any>>> = { [K in keyof T]: `${K & string}_${keyof T[K] & string}` }
- 泛型约束
T extends Record<string, Record<string, any>>确保传入的对象是“键对应嵌套对象”的结构 K & string和keyof T[K] & string用于确保模板字符串类型能正确拼接(TypeScript需要明确类型为字符串)
2. 泛型类型的使用
直接将目标对象的类型传入泛型即可:
// 针对示例对象生成目标类型 type DemoResult = GenerateKeyCombinedType<typeof demoObj> // DemoResult的结构与ExpectedType完全一致
3. 结合函数实现类型推断(可选)
如果需要在函数中自动推断传入对象的类型并返回对应类型,可以创建辅助函数:
function getKeyCombinedType<T extends Record<string, Record<string, any>>>(obj: T): GenerateKeyCombinedType<T> { // 可根据需求实现运行时逻辑,比如生成对应的值集合 return Object.fromEntries( Object.entries(obj).map(([key, nestedObj]) => [ key, Object.keys(nestedObj).map(nestedKey => `${key}_${nestedKey}`) as any ]) ) as GenerateKeyCombinedType<T> } // 使用示例 const result = getKeyCombinedType(demoObj) // result的类型自动推断为GenerateKeyCombinedType<typeof demoObj>
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

