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

TypeScript 如何从数组对象变量创建带约束的Record类型

首先,你需要先给原始的cssColorsObject加上as const断言,避免TypeScript将数组成员类型拓宽为通用的string,无法做具体颜色值的归属校验:

const cssColorsObject = {
    red: ["lightsalmon", "salmon", "darksalmon", "lightcoral", "indianred", "crimson", "firebrick", "red", "darkred"],
    orange: ["coral", "tomato", "orangered", "gold", "orange", "darkorange"],
    yellow: [/* 你的黄色系颜色值 */]
    // 其他色系分类
} as const;

场景1:允许仅包含部分色系键,每个键对应数组为该色系颜色子集

你整理的实现方案是正确的,代码如下:

type CssColorsPartial = Partial<{
    [Prop in keyof typeof cssColorsObject]: Array<typeof cssColorsObject[Prop][number]>;
}>;

校验示例:

const demo1: CssColorsPartial = {
    red: ["lightsalmon", "salmon"], // 合法
    orange: [], // 合法
    // yellow: ["lightsalmon"] // 报错,lightsalmon不属于yellow色系的合法值
}

场景2:强制必须包含所有色系键,仅数组值为对应色系颜色子集

去掉外层的Partial即可:

type CssColorsFull = {
    [Prop in keyof typeof cssColorsObject]: Array<typeof cssColorsObject[Prop][number]>;
};

实现原理

  • as const 断言将原始对象的所有属性值固定为字符串字面量类型,让TypeScript可以识别每个颜色值所属的色系分类
  • 映射类型[Prop in keyof typeof cssColorsObject]会遍历原始对象的所有色系键
  • 每个键对应的取值类型Array<typeof cssColorsObject[Prop][number]>,表示该数组的元素只能是当前键对应原始数组的成员子集,自动限制了跨色系的非法值
  • Partial工具类型将所有键设为可选,支持仅使用部分色系的场景

内容的提问来源于stack exchange,提问作者JimmyTheCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:48:01