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

TypeScript中能否定义判断数字是否被4整除的泛型类型?

TypeScript泛型判断数字是否能被4整除的实现方案

首先明确:TypeScript的类型系统不支持直接使用算术运算符(如%、+、-)进行数值计算,你代码里的T%4写法在类型层面是无效的——类型操作的核心是处理类型结构,而非直接对数值进行运算。

可行实现方案

方案1:基于字符串匹配(推荐,高效且支持大数)

利用数学特征:一个数能被4整除的充要条件是其最后两位能被4整除。通过模板字符串将数字转为字符串,提取最后两位并判断是否在预定义的可被4整除的数字集合中:

// 预定义所有能被4整除的一位数和两位数
type DivisibleBy4Endings = 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | 96;

type IsDivisibleBy4<T extends number> = 
  // 0本身能被4整除
  T extends 0 ? true :
  // 提取数字的最后两位
  `${T}` extends `${string}${infer LastTwo extends number}`
    ? LastTwo extends DivisibleBy4Endings
      ? true
      : false
    : false;

测试示例:

type Test1 = IsDivisibleBy4<4>;    // true
type Test2 = IsDivisibleBy4<5>;    // false
type Test3 = IsDivisibleBy4<12>;   // true
type Test4 = IsDivisibleBy4<100>;  // true
type Test5 = IsDivisibleBy4<101>;  // false

方案2:基于元组长度的递归减法(适合小数字)

通过元组长度模拟数字,递归减去4直到结果小于4,判断最终是否为0:

// 生成指定长度的元组,用于模拟数字
type TupleLength<N extends number, T extends any[] = []> = 
  T['length'] extends N ? T : TupleLength<N, [...T, any]>;

// 实现减法:计算 N - M 的结果
type Subtract<N extends number, M extends number> = 
  TupleLength<N> extends [...TupleLength<M>, ...infer Rest] ? Rest['length'] : never;

// 递归判断是否能被4整除
type IsDivisibleBy4<T extends number> = 
  T extends 0 ? true :
  // 若T减4后为有效数字,继续递归判断
  Subtract<T, 4> extends infer R extends number
    ? IsDivisibleBy4<R>
    : false;

测试示例:

type Test6 = IsDivisibleBy4<8>;  // true
type Test7 = IsDivisibleBy4<9>;  // false

注意:这个方案受限于TypeScript的递归深度限制,当数字过大(如超过1000)时会触发类型计算溢出错误,仅适合小范围数字场景。

内容的提问来源于stack exchange,提问作者Adrian Abadán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:55:01