如何从TypeScript字符串联合类型生成对应对象?
实现TypeScript类型与枚举对象的自动同步
你无法直接让TypeScript仅通过修改Color类型就自动生成运行时的Colors对象——因为TypeScript是静态类型系统,编译时的类型信息不会保留到运行时。但可以通过以下两种方式实现“只维护一处,自动同步类型和对象”的目标:
方案一:从类型约束对象,编译器强制同步
先定义Color类型,再用辅助函数创建Colors对象,确保对象的键值完全匹配类型成员,新增类型成员时编译器会主动报错提示你更新对象:
// 只需要在这里修改类型,新增颜色 type Color = "red" | "blue" | "green" | "yellow"; // 辅助函数,约束对象的键值必须与类型成员一致 const createEnumLike = <T extends string>(obj: { [K in T]: K }) => obj; // 新增Color成员后,TypeScript会报错提示此处缺少对应属性,只需补充键值对 const Colors = createEnumLike<Color>({ red: "red", blue: "blue", green: "green", yellow: "yellow" }); // 客户端正常使用 console.log(Colors.red); // 输出 "red"
方案二:从数组反向推导(更推荐)
先定义包含所有颜色的const数组,再从数组自动推导Color类型和生成Colors对象,新增颜色只需修改数组:
// 只需要在这里新增颜色元素 const COLORS = ["red", "blue", "green", "yellow"] as const; // 从数组自动推导Color类型 type Color = (typeof COLORS)[number]; // 从数组自动生成Colors对象 const Colors = Object.fromEntries(COLORS.map(color => [color, color])) as { [K in Color]: K }; // 客户端正常使用 console.log(Colors.red); // 输出 "red"
这个方案更高效,完全不需要手动维护类型和对象的对应关系,新增颜色时只需要在COLORS数组里添加元素即可,类型和对象会自动同步更新。
内容的提问来源于stack exchange,提问作者Rollie
相关产品推荐
相关产品推荐

