0Pricing
TypeScript Academy · Урок

Практические утилиты числовых типов

Применяйте арифметику типов к ограничениям диапазона и длины

«Практические утилиты числовых типов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 4 из 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]>;

Перечисление: от 0 до N-1

Вспомогательный тип, лежащий в основе многих решений, создаёт объединение всех чисел от 0 до N-1. Постройте кортеж длины N и получите каждый его числовой индекс.

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

type A = Enumerate<4>; // 0 | 1 | 2 | 3

Типы диапазонов

Range<Start, End> выдаёт числа от Start до End - 1. Возьмите Enumerate<End> и исключите значения, меньшие Start.

type Range<S extends number, E extends number> =
  Exclude<Enumerate<E>, Enumerate<S>>;

type A = Range<2, 6>; // 2 | 3 | 4 | 5

Ограничение параметра

Используйте диапазон, чтобы ограничить допустимые аргументы. Функция, принимающая только небольшой результат броска кубика, может использовать Range<1, 7>, и тогда компилятор отклонит значения за пределами диапазона.

type DiceFace = Range<1, 7>; // 1|2|3|4|5|6
declare function roll(face: DiceFace): void;
roll(4); // ok
// roll(8); // compile error

Проверка длины массива

Тип массива фиксированной длины отклоняет массивы неправильного размера. Постройте с помощью рекурсии кортеж из N элементов типа T.

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

type RGB = FixedArray<number, 3>; // [number, number, number]

Использование фиксированной длины

Теперь неправильное использование приводит к ошибке компиляции. Точка в трёхмерном пространстве должна иметь ровно три координаты.

type Vec3 = FixedArray<number, 3>;
const v: Vec3 = [1, 2, 3]; // ok
// const w: Vec3 = [1, 2]; // error: missing element

Ограничение индексов

Можно ограничить тип индекса допустимыми позициями массива. Объедините длину кортежа с Enumerate, чтобы принимать только индексы, находящиеся в пределах массива.

type Indices<T extends readonly unknown[]> = Enumerate<T["length"]>;

type Arr = readonly ["a", "b", "c"];
type I = Indices<Arr>; // 0 | 1 | 2

Безопасный доступ по индексу

С типом допустимых индексов можно написать функцию чтения, параметр индекса которой не позволит выйти за границы массива, обнаруживая ошибки на единицу уже во время компиляции.

declare function at<T extends readonly unknown[]>(
  arr: T,
  i: Indices<T>
): T[Indices<T>];

const x = at(["a", "b", "c"] as const, 2); // ok
// at(["a", "b", "c"] as const, 3); // error

Вспомогательные типы минимума и максимума

Добавьте поверх этого сравнение, чтобы выбирать большее или меньшее из двух чисел. Это удобно для ограничения значения заданным диапазоном.

type Max<A extends number, B extends number> =
  GreaterThan<A, B> extends true ? A : B;
type Min<A extends number, B extends number> =
  GreaterThan<A, B> extends true ? B : A;

type X = Max<3, 8>; // 8
type Y = Min<3, 8>; // 3

Комбинация инструментов

Эти инструменты можно комбинировать. Кортеж имеет длину из заданного диапазона, индекс ограничен размером массива, а значение ограничено минимумом и максимумом — каждый из этих инструментов является небольшой переиспользуемой функцией на уровне типов.

type ValidPort = Range<1, 4>; // 1 | 2 | 3 (toy example)
type Slots = FixedArray<ValidPort, 2>; // [1|2|3, 1|2|3]

Когда это оправданно

Арифметика на уровне типов особенно полезна при небольших фиксированных пределах: для кортежей RGB, граней кубика, координат на игровой доске и размеров полей протокола. Она не оправданна для больших или динамических чисел, когда ограничения рекурсии и сложность перевешивают преимущества безопасности. Используйте её, когда предел мал, а гарантия важна.

type Board = FixedArray<FixedArray<0 | 1, 3>, 3>; // 3x3 grid

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

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

Итоги

Вы создали небольшую библиотеку числовых инструментов на уровне типов.

  • Enumerate и Range создают объединения чисел.
  • FixedArray обеспечивает точную длину.
  • Indices ограничивает доступ допустимыми позициями.
  • Min/Max ограничивают значения.

Используйте их для небольших фиксированных пределов. Далее — курс 23: имитация типов высшего рода.

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

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

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

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

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

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

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

Сколько времени занимает урок «Практические утилиты числовых типов»?

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

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

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

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

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