如何为指定结构的输出对象动态创建TypeScript类型?
能否实现给每个键生成带键名后缀的字段类型?
当然可以实现,TypeScript的模板字面量类型(Template Literal Types)正好能满足这个需求,它支持在类型层面拼接字符串,以此生成带特定后缀的属性名。
实现代码示例
// 输入对象示例 const input = { "test": 1, "test2": "2", } // 生成目标类型的工具类型 type KeySuffixType<T extends Record<string, string | number | object | unknown[]>> = { [K in keyof T]: { [P in `${string & K}Data`]: T[K]; } & { [P in `${string & K}IsError`]: boolean; } } // 验证类型正确性 const output: KeySuffixType<typeof input> = { test: { "testData": 1, "testIsError": false, }, test2: { "test2Data": "2", "test2IsError": false, } }
关键特性说明
- 模板字面量类型:
${string & K}Data和${string & K}IsError会将输入对象的每个键名K与固定后缀拼接,动态生成对应的属性名 - 交叉类型(&):将两个包含单个属性的对象类型合并,确保每个键对应的对象同时拥有
${key}Data和${key}IsError两个字段 - 类型约束:
T extends Record<string, string | number | object | unknown[]>保证输入类型符合你最初定义的结构范围
这个实现完全贴合你最初的需求,类型推导也精准无误:testData会被推断为number类型,test2Data则为string类型。对比你提到的统一data/isError字段的简洁方案,它完全保留了原键名后缀的结构。
内容的提问来源于stack exchange,提问作者warl0ck
相关产品推荐
相关产品推荐

