You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否定义记录类型并将键作为值的泛型参数使用?

解决方案:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:31:17