能否定义记录类型并将键作为值的泛型参数使用?
解决方案:使用TypeScript映射类型
你可以直接利用TypeScript的映射类型来实现这个需求,这是专门用来创建键值对应关系类型的语法,比手动逐个定义要简洁得多:
type Color = "red" | "green" | "blue"; interface Item<ItemColor extends Color> { name: string; color: ItemColor; } // 自动生成每个键对应Item<key>的类型 type ColoredItemRecord = { [C in Color]: Item<C>; };
说明
映射类型会遍历Color联合类型中的每一个成员C,将其作为对象的键,同时把对应的值类型设为Item<C>,完全匹配你想要的red: Item<"red">、green: Item<"green">这类对应关系。
而且这个类型是动态的,如果后续Color联合类型新增了成员(比如"yellow"),ColoredItemRecord会自动包含新的键值对yellow: Item<"yellow">,不需要手动修改类型定义。
验证示例
使用这个类型时,TypeScript会严格约束每个键对应的值类型:
const validItems: ColoredItemRecord = { red: { name: "Apple", color: "red" }, green: { name: "Leaf", color: "green" }, blue: { name: "Sky", color: "blue" } }; // 下面的代码会报错,因为red对应的color不是"red" const invalidItems: ColoredItemRecord = { red: { name: "Apple", color: "green" }, // 类型错误 green: { name: "Leaf", color: "green" }, blue: { name: "Sky", color: "blue" } };
内容的提问来源于stack exchange,提问作者GjfLeo
相关产品推荐
相关产品推荐

