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

如何让TypeScript中const对象的键匹配const数组类型

解决方案

要实现keyMap的键严格匹配allowedKeys数组元素,同时保留对象值的只读特性,并导出RawKey和DisplayKey类型,你可以根据TypeScript版本选择以下两种实现方式:

方案1:使用TypeScript 4.9+的satisfies关键字(推荐)

satisfies关键字能让对象满足指定类型约束的同时,保留自身的具体字面量类型和只读特性,完美解决约束与readonly特性冲突的问题:

// 定义只读的原始键数组,const断言锁定元素类型
const allowedKeys = ["cheese_type", "jalapeno_qty", "pepperoni"] as const;

// 导出原始键类型:直接从数组元素派生
export type RawKey = typeof allowedKeys[number];

// 定义键映射的约束类型:必须包含所有RawKey作为键,值为字符串
type KeyMapConstraint = {
  [K in RawKey]: string;
};

// 创建键映射:用satisfies确保符合约束,as const保留值的只读字面量类型
const keyMap = {
  cheese_type: "Cheese type",
  jalapeno_qty: "Number of jalapeños",
  pepperoni: "Pepperoni",
} as const satisfies KeyMapConstraint;

// 导出显示键类型:提取keyMap值的具体字面量类型
export type DisplayKey = typeof keyMap[keyof typeof keyMap];

效果说明

  • 如果keyMap缺少allowedKeys中的某个键、拼写错误,或者存在多余键,TypeScript会直接抛出编译错误。
  • keyMap在运行时是只读对象,编译时其值的类型是精确的字符串字面量(比如"Cheese type"而非宽泛的string)。
  • RawKey类型为"cheese_type" | "jalapeno_qty" | "pepperoni",DisplayKey类型为"Cheese type" | "Number of jalapeños" | "Pepperoni"。

方案2:兼容TypeScript 4.9以下版本

如果你的项目使用低版本TS,可以通过双重断言实现同样效果:

const allowedKeys = ["cheese_type", "jalapeno_qty", "pepperoni"] as const;
export type RawKey = typeof allowedKeys[number];

// 先创建带const断言的对象,再用类型断言确保键严格匹配RawKey
const keyMap = {
  cheese_type: "Cheese type",
  jalapeno_qty: "Number of jalapeños",
  pepperoni: "Pepperoni",
} as const as { [K in RawKey]: typeof keyMap[K] };

export type DisplayKey = typeof keyMap[keyof typeof keyMap];

效果说明

  • 同样保证keyMap的键与allowedKeys完全一致,编译时校验拼写和完整性。
  • 保留了keyMap值的只读字面量类型,运行时对象不可修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:15:27