如何基于联合类型的键创建带不同值类型的TypeScript类型?
解决方案
你可以通过类型映射表+映射类型的组合实现需求,既能让MyRecord严格关联MyUnion的键集合,又能为每个键绑定对应具体类型,步骤如下:
- 先定义类型映射表,把
MyUnion的每个键和对应Item类型一一绑定:
type ItemTypeMap = { item1: Item1Type; item2: Item2Type; };
这个映射表会被TypeScript自动检查:如果MyUnion的键在表中无对应项,或者表中出现MyUnion外的键,都会触发类型报错,确保映射关系完整。
- 用映射类型遍历
MyUnion的所有成员,生成严格约束的MyRecord:
type MyRecord = { [K in MyUnion]: ItemTypeMap[K]; };
效果验证
- 误写
item3这类MyUnion外的键时,TypeScript直接报错:
// 错误:类型“"item3"”的属性不在类型“MyRecord”中 const invalidRecord: MyRecord = { item1: {a: 4, b: 5}, item2: {c: 6, d: 7}, item3: {} };
- 遗漏
MyUnion中的键时,同样触发报错:
// 错误:类型 "{ item1: { a: number; b: number; }; }" 中缺少属性 "item2" const incompleteRecord: MyRecord = { item1: {a: 4, b: 5} };
- 每个键的类型也会被严格约束,比如把
item1的类型写成Item2Type也会报错。
内容的提问来源于stack exchange,提问作者Yoav Moran
相关产品推荐
相关产品推荐

