TypeScript Academy · Урок

Множественное число с типами

Моделируйте формы множественного числа типобезопасным способом

Урок 3 из 413 шагов

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

Типобезопасное образование форм числа

Языкам нужны формы числа: «1 предмет» и «2 предмета». Типобезопасная интернационализация моделирует категории числа (например, one / other) и требует аргумент count, чтобы Вы никогда не забывали его передать.

Категории числа

Правила склонения числительных Intl определяют такие категории, как zero, one, two, few, many, other. В английском используются только one и other, а в других локалях — больше категорий.

type PluralCategory = "zero" | "one" | "two" | "few" | "many" | "other";

Структура сообщения с формами числа

Представляйте сообщение с формами числа как объект, ключами которого являются категории. other — обязательный запасной вариант.

type PluralMessage = {
  other: string;
} & Partial<Record<Exclude<PluralCategory, "other">, string>>;

const items: PluralMessage = {
  one: "{count} item",
  other: "{count} items",
};

Различение сообщений с формами числа и обычных

Каталог объединяет обычные строки и объекты с формами числа. Требования к аргументам различаются, поэтому мы определяем структуру на уровне типов.

type IsPlural<M> = M extends { other: string } ? true : false;

Обязательный счётчик

Когда сообщение содержит формы числа, аргументы функции перевода должны включать числовой count. Мы вычисляем тип аргументов условно.

type PluralArgs<M> = IsPlural<M> extends true
  ? { count: number }
  : {};

type A = PluralArgs<typeof items>; // { count: number }

Типизированная функция перевода для форм числа

Объедините поиск в каталоге с условными аргументами, чтобы сообщения с формами числа требовали count, а обычные сообщения — нет.

declare const cat: {
  items: { one: string; other: string };
  hello: string;
};

declare function t<K extends keyof typeof cat>(
  key: K,
  args: PluralArgs<(typeof cat)[K]>
): string;

t("items", { count: 3 }); // ok
t("items", {});           // Error: count required
t("hello", {});           // ok

Выбор формы во время выполнения

Во время выполнения Intl.PluralRules выбирает категорию по значению count, а Вы читаете соответствующую строку, используя other как запасной вариант.

function plural(msg: { other: string; [k: string]: string }, count: number, locale: string) {
  const cat = new Intl.PluralRules(locale).select(count);
  return (msg[cat] ?? msg.other);
}

Объединение с интерполяцией

Строки с формами числа обычно также содержат {count}. Тип аргументов может объединять требования к формам числа с извлечёнными переменными интерполяции выбранной формы.

type FullArgs<M> = PluralArgs<M> & ExtractVars<M>;
// count plus any {placeholders} in the message

Локали с большим числом форм

Некоторые локали, например польская и русская, используют few и many. Поскольку PluralCategory уже включает их, каталог может предоставлять эти ключи, а тот же механизм обработает их.

const ruItems = {
  one: "{count} товар",
  few: "{count} товара",
  many: "{count} товаров",
  other: "{count} товара",
};

Обязательный запасной вариант для остальных случаев

Поскольку other обязателен в PluralMessage, система типов гарантирует наличие запасного варианта и предотвращает ситуацию во время выполнения, когда ни одна форма числа не подходит.

Почему это важно

Ошибки форм числа, например неверное «1 предметы», и забытые счётчики часто встречаются в интернационализации без типизации. Моделирование категорий как типов и обязательный count делают правильное образование форм числа стандартным поведением, а отсутствие счётчика — ошибкой компиляции.

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

Проверьте своё понимание типобезопасного образования форм числа.

Итоги

Вы представили формы числа как объекты с ключами в виде категорий числа и обязательным запасным вариантом other, определяли сообщения с формами числа на уровне типов и требовали числовой аргумент count с помощью условных типов. Intl.PluralRules выбирает форму во время выполнения, а тот же механизм масштабируется на локали с большим числом форм.

Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

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

Курсы
101
Уроки
352

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

Урок «Множественное число с типами» бесплатный?

Да — полный текст урока «Множественное число с типами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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