Liczba mnoga z typami
Modeluj formy liczby mnogiej w bezpieczny typowo sposób
Liczba mnoga z typami to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej TypeScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Pluralizacja z kontrolą typów
Języki potrzebują form liczby mnogiej: „1 element” i „2 elementy”. Bezpieczna typowo obsługa i18n modeluje pluralizację za pomocą kategorii (takich jak one / other) i wymaga argumentu count, dzięki czemu nie można o nim zapomnieć.
Kategorie liczby mnogiej
Reguły pluralizacji Intl definiują kategorie takie jak zero, one, two, few, many, other. Język angielski używa tylko one i other, natomiast inne locale wykorzystują ich więcej.
type PluralCategory = "zero" | "one" | "two" | "few" | "many" | "other";Struktura komunikatu z liczbą mnogą
Komunikat z formami liczby mnogiej należy reprezentować jako obiekt, którego kluczami są kategorie. other jest wymaganym wariantem zapasowym.
type PluralMessage = {
other: string;
} & Partial<Record<Exclude<PluralCategory, "other">, string>>;
const items: PluralMessage = {
one: "{count} item",
other: "{count} items",
};Rozróżnianie komunikatów z liczbą mnogą i zwykłych
Katalog zawiera zarówno zwykłe ciągi znaków, jak i obiekty z formami liczby mnogiej. Wymagania dotyczące argumentów są różne, dlatego strukturę rozpoznajemy na poziomie typów.
type IsPlural<M> = M extends { other: string } ? true : false;Wymaganie count
Gdy komunikat ma formy liczby mnogiej, argumenty funkcji translate muszą zawierać liczbowy element count. Typ argumentów obliczamy warunkowo.
type PluralArgs<M> = IsPlural<M> extends true
? { count: number }
: {};
type A = PluralArgs<typeof items>; // { count: number }Typowane t dla liczby mnogiej
Połączenie wyszukiwania w katalogu z warunkowym typem argumentów sprawia, że komunikaty z formami liczby mnogiej wymagają count, a zwykłe — nie.
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", {}); // okWybieranie formy w czasie działania
W czasie działania Intl.PluralRules wybiera kategorię na podstawie wartości count, a następnie odczytywany jest pasujący tekst (z użyciem other jako wartości zapasowej).
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);
}Łączenie z interpolacją
Teksty z formami liczby mnogiej zwykle zawierają również {count}. Typ argumentów może łączyć wymagania dotyczące liczby mnogiej z wyodrębnionymi zmiennymi interpolacji z wybranej formy.
type FullArgs<M> = PluralArgs<M> & ExtractVars<M>;
// count plus any {placeholders} in the messageLocale z bogatszymi formami
Niektóre locale (np. polskie i rosyjskie) używają kategorii few i many. Ponieważ PluralCategory już je zawiera, katalog może udostępniać te klucze, a ten sam mechanizm obsłuży takie locale.
const ruItems = {
one: "{count} товар",
few: "{count} товара",
many: "{count} товаров",
other: "{count} товара",
};Wymuszanie wartości zapasowej other
Ponieważ other jest obowiązkowe w PluralMessage, system typów gwarantuje istnienie wartości zapasowej i zapobiega sytuacji w czasie działania, w której żadna forma liczby mnogiej nie pasuje.
Dlaczego to ma znaczenie
Błędy pluralizacji („1 elementów”) i pomijanie wartości count są częste w i18n bez typów. Modelowanie kategorii jako typów oraz wymaganie count sprawiają, że poprawna pluralizacja jest domyślnym zachowaniem, a brak count staje się błędem kompilacji.
Szybki test
Proszę sprawdzić, czy rozumieją Państwo pluralizację z kontrolą typów.
Podsumowanie
Formy liczby mnogiej zostały zamodelowane jako obiekty z kluczami będącymi kategoriami liczby mnogiej i obowiązkową wartością zapasową other, komunikaty z formami liczby mnogiej są wykrywane na poziomie typów, a warunkowe typy wymagają liczbowego argumentu count. Intl.PluralRules wybiera formę w czasie działania, a ten sam mechanizm skaluje się na locale z bogatszymi formami.
Często zadawane pytania
Czy lekcja „Liczba mnoga z typami” jest bezpłatna?
Tak — pełny tekst „Liczba mnoga z typami” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu TypeScript Academy, przejdź na CoddyKit PRO. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Liczba mnoga z typami”?
Modeluj formy liczby mnogiej w bezpieczny typowo sposób Ćwiczysz TypeScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć TypeScript Academy?
Nie wymagamy żadnego doświadczenia. TypeScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Liczba mnoga z typami”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji TypeScript Academy?
Tak. Każda lekcja TypeScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Typowanie kluczy tłumaczeń
- Bezpieczeństwo typów interpolacji
- Liczba mnoga z typami
- Wnioskowanie typów zależne od lokalizacji