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

如何限制TypeScript索引类型键取值范围且禁止已声明键值为undefined

实现方案

这个需求完全可以实现,推荐两种适配不同场景的写法:

方案1:开启编译选项配合可选映射类型

TS默认可选属性会隐含| undefined类型,你可以在tsconfig.json的compilerOptions中开启exactOptionalPropertyTypes配置,该配置会让可选属性仅代表「键可缺省」,如果键存在,则值必须严格匹配定义的类型,不允许为undefined。
开启配置后代码写法如下:

type PossibleName = 'isaac' | 'john';

const LOOKUP: {
  [key in PossibleName]?: { name: string, age: number };
} = {
  isaac: { name: 'isaac', age: 20 }, // 合法
  // john 可以缺省不写
  // isaac: undefined 会直接报错
  // 新增 whatever 等不在PossibleName范围内的键也会报错
};

方案2:使用satisfies操作符(无需修改全局配置)

如果你使用的是TS 4.9及以上版本,不想修改全局编译配置,可以用satisfies实现同样效果:

type PossibleName = 'isaac' | 'john';
type UserInfo = { name: string, age: number };

const LOOKUP = {
  isaac: { name: 'isaac', age: 20 }
} satisfies Partial<Record<PossibleName, UserInfo>>;

这种写法的校验逻辑和方案1完全一致,而且不会影响全局TS配置。

之前尝试报错的原因说明

  • 尝试1报错:普通索引签名仅支持string/number/symbol等通用类型作为键的类型,不能直接用联合字面量类型,TS提示的映射类型就是你尝试2里用的key in xxx写法。
  • 尝试2报错:映射类型默认所有枚举的键都是必填项,所以缺省john就会触发缺少必填属性的报错。
  • 可选映射类型允许undefined:这是TS默认行为,上述两个方案就是针对这个问题的修复方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:06:03