0Pricing
TypeScript Academy · Lekcja

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", {});           // ok

Wybieranie 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 message

Locale 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

  1. Typowanie kluczy tłumaczeń
  2. Bezpieczeństwo typów interpolacji
  3. Liczba mnoga z typami
  4. Wnioskowanie typów zależne od lokalizacji
← Powrót do TypeScript Academy