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

如何为对象键指定匹配{integer}a+{integer}c模式的类型(支持无限组合)?

用TypeScript类型系统实现对象键的模式约束

要在类型层面保证对象的键必须符合{integer}a+{integer}c的模式,你可以利用TypeScript的模板字符串类型和递归类型定义来实现,完全不需要运行时逻辑。

实现步骤

  1. 定义整数类型(可选,用于严格匹配整数)
    如果你需要严格限制键中的数字是整数(而非小数),可以先递归定义一个整数类型:

    // 单个数字字符
    type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
    // 递归定义正整数(支持多位数,受TypeScript递归深度限制,日常场景足够使用)
    type Integer = Digit | `${Digit}${Integer}`;
    
  2. 定义符合要求的键类型
    用模板字符串类型组合出你需要的键模式:

    // 若允许小数,可简化为 `${number}a+${number}c`
    type ValidKey = `${Integer}a+${Integer}c`;
    
  3. 创建带约束的对象类型
    用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:07:33