0Pricing
TypeScript Academy · Урок

Сравнения на уровне типов

Сравнивайте числа полностью на уровне типов

«Сравнения на уровне типов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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

Рекурсивной версии нужен 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)

Быстрая проверка

Проверьте, насколько хорошо Вы поняли сравнения на уровне типов.

Итоги

Теперь Вы умеете упорядочивать числа в системе типов.

  • Равенство определяется взаимной совместимостью литералов при присваивании.
  • GreaterThan определяется префиксом длины B и дополнительным элементом.
  • LessThan меняет аргументы местами, а Gte добавляет проверку равенства.
  • Метод работает с небольшими числовыми литералами, но не с широким типом number.

Далее: превращение всех этих идей в практические инструменты.

Часто задаваемые вопросы

Урок «Сравнения на уровне типов» бесплатный?

Да — полный текст урока «Сравнения на уровне типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сравнения на уровне типов»?

Сравнивайте числа полностью на уровне типов Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Сравнения на уровне типов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Подсчёт с помощью длины кортежа
  2. Сложение и вычитание на уровне типов
  3. Сравнения на уровне типов
  4. Практические утилиты числовых типов
← Назад к TypeScript Academy