如何为对象键指定匹配{integer}a+{integer}c模式的类型(支持无限组合)?
用TypeScript类型系统实现对象键的模式约束
要在类型层面保证对象的键必须符合{integer}a+{integer}c的模式,你可以利用TypeScript的模板字符串类型和递归类型定义来实现,完全不需要运行时逻辑。
实现步骤
定义整数类型(可选,用于严格匹配整数)
如果你需要严格限制键中的数字是整数(而非小数),可以先递归定义一个整数类型:// 单个数字字符 type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'; // 递归定义正整数(支持多位数,受TypeScript递归深度限制,日常场景足够使用) type Integer = Digit | `${Digit}${Integer}`;定义符合要求的键类型
用模板字符串类型组合出你需要的键模式:// 若允许小数,可简化为 `${number}a+${number}c` type ValidKey = `${Integer}a+${Integer}c`;创建带约束的对象类型
用ValidKey作为索引类型,定义你的对象:type ObjectWithPatternKeys = { [K in ValidKey]?: number; // ?: 表示键是可选的,若需要必填则去掉? };
用法示例
合法场景
const validObj: ObjectWithPatternKeys = { "2a+1c": 42, "100a+200c": 100, "0a+0c": 0 }; // 完全符合类型约束,无编译错误
非法场景
const invalidObj: ObjectWithPatternKeys = { "2b+1c": 42, // ❌ 报错:键不符合`xa+yc`的格式 "1.5a+2c": 100, // ❌ 报错:包含小数,不符合Integer类型约束 "abc": 50 // ❌ 报错:完全不匹配模式 };
原理说明
TypeScript的模板字符串类型支持模式匹配检查,当你用${Integer}a+${Integer}c作为键的类型时,编译器会在编译阶段验证每个键是否符合这个模式。和你之前用枚举的方式不同,这种方式不需要枚举所有可能的键,而是通过模式匹配覆盖无限多的合法键。
内容的提问来源于stack exchange,提问作者perepm
相关产品推荐
相关产品推荐

