0Pricing
TypeScript Academy · Урок

Подсчёт с помощью длины кортежа

Представляйте числа как длины кортежей в типах

«Подсчёт с помощью длины кортежа» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Числам нужно представление

Система типов не умеет напрямую складывать числовые литералы. Классический обходной путь — представить число N как кортеж из N элементов. Содержимое не имеет значения, важна только длина.

type Three = [unknown, unknown, unknown];
type N = Three["length"]; // 3

Чтение длины

У каждого типа кортежа есть свойство length, являющееся числовым литеральным типом. Обращение по индексу ["length"] позволяет получить его как число, которое можно использовать.

type A = [1, 2, 3, 4]["length"]; // 4
type B = []["length"];           // 0
type C = ["x"]["length"];        // 1

Почему используется неизвестный заполнитель

Мы используем unknown как тип элементов, потому что сами значения не имеют значения — важен только их подсчёт. Подойдёт любой тип, но unknown ясно обозначает «заполнитель».

type Two = [unknown, unknown];
type N = Two["length"]; // 2

Построение кортежа длины N

Чтобы выполнить обратное преобразование, постройте кортеж нужной длины с помощью рекурсии. Добавляйте элементы, пока длина не совпадёт с N, затем верните кортеж. Для этого используется известный вспомогательный тип BuildTuple.

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

type A = BuildTuple<3>; // [unknown, unknown, unknown]

Как работает цикл BuildTuple

Проследим за работой BuildTuple<3>:

  • Длина аккумулятора равна 0, а не 3 — добавляем один элемент
  • Длина аккумулятора равна 1, а не 3 — добавляем один элемент
  • Длина аккумулятора равна 2, а не 3 — добавляем один элемент
  • Длина аккумулятора равна 3, то есть 3 — возвращаем результат

Длина аккумулятора служит счётчиком цикла.

type A = BuildTuple<2>; // [unknown, unknown]

Длина — связующее звено

Две операции позволяют переходить между числами и кортежами:

  • Из числа в кортеж: BuildTuple<N>
  • Из кортежа в число: T["length"]

Вся арифметика на уровне типов строится на переходе через это связующее звено.

type FromN = BuildTuple<4>;        // tuple of length 4
type BackToN = FromN["length"];    // 4

Сравнение по длине

Поскольку длина кортежа является литеральным значением, можно проверять равенство количества элементов. Постройте кортежи и сравните их длины по совместимости при присваивании.

type SameLength<A extends unknown[], B extends unknown[]> =
  A["length"] extends B["length"] ? true : false;

type X = SameLength<[1, 2], ["a", "b"]>;   // true
type Y = SameLength<[1], ["a", "b"]>;      // false

Обобщённый счётчик длины

Для понимания принципа можно заново реализовать length с помощью рекурсии, хотя чтение ["length"] выполняется быстрее. Это показывает, что подсчёт — всего лишь последовательный проход по кортежу.

type Len<T extends unknown[], Acc extends unknown[] = []> =
  T extends [unknown, ...infer R]
    ? Len<R, [...Acc, unknown]>
    : Acc["length"];

type A = Len<["a", "b", "c"]>; // 3

Кортежи как счётчики

Представьте кортеж как счётную таблицу: каждый элемент — одна отметка. Добавление элемента увеличивает счётчик, а удаление уменьшает его. Такая мысленная модель делает арифметику понятной.

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

type A = Inc<3>; // 4

Предварительный обзор уменьшения

Уменьшение строит кортеж для N, затем выводит всё, кроме последнего элемента, и считывает длину получившегося более короткого кортежа. В следующем уроке Вы оформите это правило в виде типа.

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

type A = Dec<3>; // 2
type B = Dec<0>; // 0

Ограничения, о которых важно помнить

Этот метод работает с небольшими неотрицательными целыми числами. Очень большое N приводит к достижению ограничения рекурсии, а встроенной поддержки отрицательных чисел и дробей нет. В этих пределах метод надёжен и полностью статичен.

type A = BuildTuple<5>["length"]; // 5 (fine)
// BuildTuple<10000> would error: too deep

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

Проверьте, насколько хорошо Вы поняли подсчёт длины кортежей.

Итоги

Подсчёт — основа математики на уровне типов.

  • Представляйте N как кортеж длины N.
  • Считывайте число с помощью T["length"].
  • BuildTuple<N> преобразует число в кортеж.
  • Метод работает только с небольшими неотрицательными целыми числами.

Далее: настоящее сложение и вычитание.

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

Урок «Подсчёт с помощью длины кортежа» бесплатный?

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

Чему я научусь в уроке «Подсчёт с помощью длины кортежа»?

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

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

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

Сколько времени занимает урок «Подсчёт с помощью длины кортежа»?

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

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

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

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

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