如何创建仅接受4的倍数数值的TypeScript类型?
创建仅接受4的倍数的TypeScript类型
要实现一个仅接受4的倍数的类型,我们可以结合品牌类型(Branded Type)和条件类型,既支持编译时对字面量数值的校验,也能在运行时处理动态数值。
实现代码
// 定义品牌类型,标记这是4的倍数的数值 type MultipleOfFour = number & { __brand: 'MultipleOfFour' }; // 条件类型:判断字面量数值是否为4的倍数(仅对字面量有效) type IsMultipleOfFour<T extends number> = T extends 0 ? true : T extends 4 ? true : T extends 8 ? true : T extends 12 ? true : T extends 16 ? true : // 可按需扩展常用的4的倍数,超出范围的字面量会触发never类型报错 (T extends number ? (T % 4 extends 0 ? true : false) : false); // 创建4的倍数的工具函数,同时做编译时和运行时校验 function createMultipleOfFour<T extends number>(n: T): IsMultipleOfFour<T> extends true ? MultipleOfFour : never { if (n % 4 !== 0) { throw new Error(`错误:${n}不是4的倍数`); } return n as MultipleOfFour; } // 使用示例 const validValue = createMultipleOfFour(8); // ✅ 编译通过,运行正常 const invalidLiteral = createMultipleOfFour(9); // ❌ 编译时报错:类型“9”的参数不能赋给类型“never”的参数 const dynamicValue = 12; const validDynamic = createMultipleOfFour(dynamicValue); // ✅ 运行时校验通过 const invalidDynamic = createMultipleOfFour(10); // ❌ 运行时抛出错误:错误:10不是4的倍数
说明
- 品牌类型:通过
number & { __brand: 'MultipleOfFour' }标记特定数值,避免普通number直接赋值给MultipleOfFour类型。 - 条件类型:对常用的4的倍数字面量做显式匹配,其他数值通过
T % 4 extends 0判断(TypeScript处理字面量时能计算模运算结果)。 - 工具函数:同时完成编译时校验(字面量)和运行时校验(动态数值),确保全场景拦截非4的倍数的数值。
如果只需要编译时对字面量的校验,可简化为:
type MultipleOfFour<T extends number> = T extends 0 ? T : T extends 4 ? T : T extends 8 ? T : T extends 12 ? T : // 按需扩展更多4的倍数... never; const valid: MultipleOfFour<8> = 8; // ✅ const invalid: MultipleOfFour<9> = 9; // ❌ 编译时报错:类型“9”不能赋值给类型“never”
这种方式更轻量,但仅对显式指定的字面量有效,无法处理动态数值。
内容的提问来源于stack exchange,提问作者fjplaurr
相关产品推荐
相关产品推荐

