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

如何创建仅接受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的倍数

说明

  1. 品牌类型:通过number & { __brand: 'MultipleOfFour' }标记特定数值,避免普通number直接赋值给MultipleOfFour类型。
  2. 条件类型:对常用的4的倍数字面量做显式匹配,其他数值通过T % 4 extends 0判断(TypeScript处理字面量时能计算模运算结果)。
  3. 工具函数:同时完成编译时校验(字面量)和运行时校验(动态数值),确保全场景拦截非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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:27:36