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

TypeScript:基于常量数组约束接口字段成员类型的方法

TypeScript 从常量数组提取成员类型约束接口字段

实现步骤

  1. 给常量数组添加as const断言
    默认情况下TypeScript会把数组里的字符串值宽泛推导为string类型,丢失精确的字面量信息,添加as const后会将数组转为只读元组类型,保留每一项的精确值:
export const PROPERTYOPTIONS = [
  { value: "tag", label: "Tag" }, 
  { value: "composition", label: "Composition" },
  { value: "solvent", label: "Solvent" },
  { value: "allergen", label: "Allergen" },
  { value: "category", label: "Category" },
  { value: "other", label: "Other" },
] as const;
  1. 通过索引访问类型提取数组成员联合类型
    用typeof 常量名[number]的写法,直接拿到数组所有项组成的联合类型,不需要手动枚举所有值:
// 自动推导为和数组项一一对应的对象联合类型
type PropertyOption = typeof PROPERTYOPTIONS[number];

interface CreatePropertyModalState {
  type: PropertyOption;
}

效果说明

  • 赋值type字段时,只能传入PROPERTYOPTIONS中已经存在的对象项,传入自定义对象、value/label不匹配的内容都会触发类型报错
  • 后续增删PROPERTYOPTIONS的数组项时,类型约束会自动同步,不需要手动修改联合类型定义,完全消除冗余代码

注意:如果不加as const断言,typeof PROPERTYOPTIONS[number]会被推导为{value: string, label: string}的宽泛类型,无法实现精确的字面量约束。如果需要去掉自动生成的readonly修饰,可以通过映射类型转换:

type PropertyOption = {
  -readonly [K in keyof typeof PROPERTYOPTIONS[number]]: typeof PROPERTYOPTIONS[number][K]
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:39:15