0Pricing
TypeScript Academy · 课时

类型级比较

完全在类型层面比较数字。

类型级比较 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

比较数字

要比较数字字面量类型,您仍然需要借助元组。思路是:同步缩小两个数字,观察哪一个先归零。先变成空元组的那一个数字更小。

type BuildTuple<N extends number, Acc extends unknown[] = []> =
  Acc["length"] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>;

字面量相等性

数字字面量的相等性使用双向可赋值性判断。当两个字面量彼此都可以扩展时,它们就相等。将它们包装在元组中可以避免联合类型带来的意外结果。

type NumEquals<A extends number, B extends number> =
  [A] extends [B] ? ([B] extends [A] ? true : false) : false;

type X = NumEquals<3, 3>; // true
type Y = NumEquals<3, 4>; // false

通过缩小判断大于

对于 A > B,为两者分别构建元组,并在每一步从各自移除一个元素。如果 B 先变为空元组,而 A 仍有元素,那么 A 就更大。

type GreaterThan<A extends number, B extends number> =
  BuildTuple<A> extends [...BuildTuple<B>, unknown, ...unknown[]]
    ? true : false;

type X = GreaterThan<5, 3>; // true
type Y = GreaterThan<3, 5>; // false

如何理解这个模式

模式 [...BuildTuple<B>, unknown, ...unknown[]] 表示:一个长度为 B 的前缀,后面至少还有一个元素。如果 A 能匹配它,就说明 A 的元素比 B 多,因此 A > B。

type A = GreaterThan<4, 4>; // false (no extra element)
type B = GreaterThan<6, 2>; // true

小于

LessThan 其实就是交换参数后的 GreaterThan。请复用已有实现,而不要重新推导。

type LessThan<A extends number, B extends number> =
  GreaterThan<B, A>;

type X = LessThan<3, 5>; // true
type Y = LessThan<5, 3>; // false

大于或等于

将比较与相等性结合起来。当 A > B 或 A == B 时,A >= B 为真。

type Gte<A extends number, B extends number> =
  GreaterThan<A, B> extends true
    ? true
    : NumEquals<A, B>;

type X = Gte<5, 5>; // true
type Y = Gte<3, 5>; // false

递归比较

另一种方法是同时递减两个数字,直到其中一个达到零。这清楚地展示了同步处理的思路:先达到零的那个数字更小。

type Cmp<A extends number, B extends number> =
  A extends 0
    ? (B extends 0 ? "eq" : "lt")
    : B extends 0
      ? "gt"
      : Cmp<Dec<A>, Dec<B>>;

type X = Cmp<3, 5>; // "lt"

对递减操作的依赖

递归版本需要上一课中的 Dec。每一步都会从两边各移除一个标记。当两者都为零时,它们相等;如果只有一方为零,则另一方更大。

type Dec<N extends number> =
  BuildTuple<N> extends [unknown, ...infer R] ? R["length"] : 0;

相等性与可赋值性

请注意:number extends number 为真,但这并不表示字面量相等。这里的比较假定使用具体的字面量类型,例如 3 和 5,而不是宽泛的 number 类型。

type A = NumEquals<3, 3>;          // true
type B = 3 extends number ? 1 : 0; // 1 (assignability, not equality)

构建排序依据

有了比较功能,您就可以编码排序规则。例如,可以在类型级别判断一个包含两个数字的元组是否按升序排列。

type IsSorted<A extends number, B extends number> =
  GreaterThan<A, B> extends true ? false : true;

type X = IsSorted<2, 5>; // true
type Y = IsSorted<5, 2>; // false

请谨慎使用

比较会消耗递归资源。它们非常适合保护较小的有限值(索引、固定限制),但不是通用的数字库。请保持操作数较小,并优先使用前缀模式形式,因为它比完整的同步递归更浅。

type A = GreaterThan<9, 4>; // true (cheap, prefix pattern)

快速检查

请检验您对类型级比较的理解。

回顾

现在,您已经可以在类型系统中对数字排序。

  • 通过字面量的双向可赋值性判断相等。
  • 通过长度为 B 的前缀加一个额外元素实现 GreaterThan。
  • LessThan 会交换参数;Gte 会加入相等性判断。
  • 适用于较小的字面量数字,不适用于宽泛的 number 类型。

下一步:将这些内容转化为实用工具。

常见问题解答

「类型级比较」课时是免费的吗?

是的 — 「类型级比较」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「类型级比较」这节课中我会学到什么?

完全在类型层面比较数字。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「类型级比较」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用元组长度计数
  2. 类型级加法与减法
  3. 类型级比较
  4. 实用数字类型工具
← 返回 TypeScript Academy