能否用模板字面量类型验证迁移键的数字递增规则?
用TypeScript模板字面量类型验证向上迁移键的格式
完全可以通过TypeScript的模板字面量类型实现这种静态验证,不需要依赖运行时处理——只要你能明确指定最大版本值(因为TypeScript的字面量类型基于有限集合)。
实现思路
- 先定义允许的起始版本数字范围(比如最大版本是
MaxVersion,那起始版本就是0到MaxVersion - 1的数字字面量集合)。 - 利用模板字面量类型和条件类型,生成符合
v${n}-v${n+1}格式的键类型。 - 基于这个键类型定义迁移函数的Record类型,静态约束所有键必须符合规则。
代码示例
假设我们指定最大版本为3(即最终迁移到v3):
// 定义允许的起始版本:0、1、2(因为2+1=3不超过最大版本) type FirstNumber = 0 | 1 | 2; // 生成符合规则的迁移键类型 type UpMigrationKey = `v${FirstNumber}-v${FirstNumber extends infer N ? N extends number ? N + 1 : never : never}`; // 迁移函数的类型定义 type MigrationFunction = () => Promise<void>; // 最终的向上迁移Record类型 type UpMigrations = Record<UpMigrationKey, MigrationFunction>; // ✅ 符合规则的写法,不会报错 const validMigrations: UpMigrations = { 'v0-v1': async () => { /* 迁移逻辑 */ }, 'v1-v2': async () => { /* 迁移逻辑 */ }, 'v2-v3': async () => { /* 迁移逻辑 */ }, }; // ❌ 不符合规则的写法,TypeScript会直接报错 const invalidMigrations: UpMigrations = { 'v0-v2': async () => {}, // 错误:键不符合v{n}-v{n+1}格式 'v3-v4': async () => {}, // 错误:超过指定的最大版本3 };
注意事项
如果你的最大版本是动态值(比如从配置文件读取的变量),TypeScript的静态类型系统无法处理这种动态范围,这时才需要结合运行时校验。但只要是固定的最大版本,静态类型就能完全满足你的验证需求。
内容的提问来源于stack exchange,提问作者distante
相关产品推荐
相关产品推荐

