能否基于TypeScript的string union类型生成匹配的键值对象?
解决方案
首先明确结论:无法直接从TypeScript字符串联合类型生成运行时对象。因为TypeScript的类型仅存在于编译阶段,编译为JavaScript后所有类型信息会被完全擦除,没有残留信息可以用来构造运行时对象。
不过你可以反过来实现,先定义运行时常量,再从常量自动推导类型,完全符合DRY原则,全程只需要编写一次枚举值,不需要重复硬编码:
实现方式1:从常量数组生成对象+推导类型
这种方式只需编写一次所有枚举值,即可同时得到联合类型和目标对象:
// 1. 仅需在这里一次写入所有枚举值,后续自动推导 const exampleValues = ["foo", "bar", "baz"] as const; // 2. 自动推导得到字符串联合类型 type Example = typeof exampleValues[number]; // 等价于 "foo" | "bar" | "baz" // 3. 自动生成目标结构的对象 const example = exampleValues.reduce((res, key) => { res[key] = key; return res; }, {} as Record<Example, Example>);
生成的example对象完全符合你要求的结构,且自带严格类型约束。
实现方式2:从常量对象推导类型
如果允许先定义对象,写法更简洁,同样只需要写一次枚举值:
// 1. 定义常量对象,as const 避免类型被拓宽为通用string const example = { foo: "foo", bar: "bar", baz: "baz" } as const; // 2. 自动推导得到字符串联合类型 type Example = keyof typeof example; // 等价于 "foo" | "bar" | "baz"
内容的提问来源于stack exchange,提问作者Steven Cao
相关产品推荐
相关产品推荐

