如何限制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
相关产品推荐
相关产品推荐

