Множественное число с типами
Моделируйте формы множественного числа типобезопасным способом
«Множественное число с типами» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Типизация ключей переводов
- Типобезопасность интерполяции
- Множественное число с типами
- Вывод типов с учётом локали