TypeScript中如何基于interface生成键名与键值一致的对象
基于 TypeScript interface 生成键值对等对象的实现方案
TypeScript 的接口(interface)属于编译期类型,运行时会被完全擦除,不存在任何运行时信息,因此原生 TS 没有能力直接从 interface 自动生成对应的运行时对象。我们通常用以下几种方案实现等价效果,保证接口和字段对象的字段完全对齐。
方案一:先定义常量对象,反向推导接口(最推荐,无额外依赖)
你可以先写需要的字段常量对象,再从对象反向推导接口,两边天然绑定不会出现不一致:
// 先定义字段常量,加as const保证值为字面量类型 const personFieldNames = { name: "name", age: "age" } as const; // 从常量反向推导Person接口,可自定义每个字段的类型 interface Person { [K in keyof typeof personFieldNames]: K extends "name" ? string : number; }
如果不需要区分字段类型,还可以简化推导逻辑:
// 所有字段都是string类型的简化写法 type Person = Record<keyof typeof personFieldNames, string>
方案二:先定义interface,编译时校验对齐
如果你必须优先定义interface,可以写一个泛型工具函数做校验,只要对象和interface字段不一致,TS会直接报编译错误:
// 泛型校验工具函数 const defineFieldMap = <T extends object>() => { return <U extends { [K in keyof T]: K }>(fieldMap: U) => fieldMap; }; // 优先定义你的interface interface Person { name: string; age: number; } // 生成字段对象,TS会自动校验是否和Person字段完全对齐 const personFieldNames = defineFieldMap<Person>()({ name: "name", age: "age" });
当你给Person新增/删除字段时,personFieldNames的定义会立刻报错,强制你同步修改,避免两边不一致。
方案三:全自动化生成(需额外工具)
如果项目中这类场景较多,不想手动编写字段对象,可以使用TS编译插件或代码生成工具实现完全自动生成:
- 使用CLI工具扫描TS文件中的interface,自动生成对应的字段常量文件
- 配置
ttypescript自定义转换器,在编译阶段直接从interface生成运行时对象
该方案需要额外配置工具链,更适合中大型项目使用。
内容的提问来源于stack exchange,提问作者mksawic
相关产品推荐
相关产品推荐

