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
相关产品推荐
相关产品推荐

