TypeScript Academy · Lektion

Locale-bevidst typeinferens

Sørg for, at alle locales har samme nøglestruktur

Lektion 4 af 413 trin

Locale-bevidst typeinferens er en gratis TypeScript Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i TypeScript Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. TypeScript Academy-kurset indeholder 4 lektioner i alt.

Lokalitetsafhængig typeinferens

En app leveres med flere lokaliteter (en, tr, de ...). Vi ønsker en type, der giver en fejl, når en lokalitet mangler nøgler, som findes i basislokaliteten, så oversættelser aldrig ubemærket kommer ud af synkronisering.

En basislokalitet

Vælg én lokalitet (normalt en) som den kanoniske nøglestruktur. Alle andre lokaliteter skal have samme form.

const en = {
  greeting: "Hello",
  cart: { empty: "Empty", checkout: "Checkout" },
} as const;

type Base = typeof en;

Begrænsning af andre lokaliteter

Typ hver ekstra lokalitet som basisformen. En manglende nøgle er nu en kompileringsfejl i den pågældende lokalitetsfil.

const tr: Base = {
  greeting: "Merhaba",
  cart: { empty: "Bo\u015f", checkout: "\u00d6deme" },
};
// Omitting cart.checkout -> Error: property missing

Registrering af ekstra nøgler

Når du bruger basistypen som typeangivelse, markeres også ukendte nøgler, der findes i en lokalitet, men ikke i basislokaliteten. På den måde opdages rester eller fejlstavede poster.

const de: Base = {
  greeting: "Hallo",
  cart: { empty: "Leer", checkout: "Kasse" },
  extra: "oops", // Error: not in Base
};

En hjælper til definition af lokaliteter

En generisk hjælper håndhæver formen, samtidig med at hver værdi bevares, så definitionen af hver lokalitet står et enkelt og overskueligt sted.

function defineLocale<T extends Base>(loc: T): T {
  return loc;
}

const fr = defineLocale({
  greeting: "Bonjour",
  cart: { empty: "Vide", checkout: "Paiement" },
});

Et register over alle lokaliteter

Saml lokaliteterne i en post. Når hver værdi begrænses til Base, garanteres en ensartet struktur i hele appen.

const locales: Record<string, Base> = { en, tr, de: fr };
// every entry must have the full Base key structure

Typeudlighed på dybt niveau

Hvis du ønsker strengere garantier, kan du opbygge en SameKeys-type, der sammenligner nøglestrukturer rekursivt og giver en fejltype, når de er forskellige, ud over det en almindelig typeangivelse kan registrere.

type SameKeys<A, B> =
  keyof A extends keyof B
    ? keyof B extends keyof A ? true : false
    : false;

Udledning af nøgler én gang

Fordi alle lokaliteter deler Base, beregnes typen for nøglestier (fra den tidligere lektion) én gang ud fra Base og genbruges for hver lokalitet, så typningen af t er uafhængig af lokaliteten.

type Key = LeafPaths<Base>;
// same valid keys regardless of active locale

Valg af lokalitet under kørsel

Under kørsel slår du op i registret ved hjælp af den aktive lokalitet. Typesystemet har allerede garanteret, at hver lokalitet har de samme nøgler, så opslagene er sikre.

function translate(locale: keyof typeof locales, key: Key): string {
  return getPath(locales[locale], key);
}

Registrering af manglende nøgler på tværs af lokaliteter

Hvis du ikke kan angive typen direkte i hver fil (f.eks. ved JSON-importer), sammenligner en typekontrol under bygningen hver importeret lokalitet med Base og viser en forskelstype med en liste over manglende nøgler.

type Missing<L> = Exclude<keyof Base, keyof L>;
type TrMissing = Missing<typeof tr>; // never if complete

Hvorfor det er vigtigt

Utypet i18n kommer ud af takt: En nøgle, der føjes til en, bliver glemt i de, så der leveres en tom eller engelsk streng. Når du begrænser hver lokalitet til en fælles basis, bliver denne forglemmelse til en kompileringsfejl, og alle lokaliteter holdes komplette og ensartede.

Hurtigt tjek

Bekræft din forståelse af lokalitetsafhængig inferens.

Opsummering

Du valgte en basislokalitet som den kanoniske form og begrænsede alle andre lokaliteter til den, så manglende eller ekstra nøgler medfører en kompileringsfejl. En defineLocale-hjælper og et begrænset register holder alle lokaliteter strukturelt identiske, og nøglestier udledes én gang fra basislokaliteten.

Gratis at komme i gang

Lær TypeScript med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
101
Lektioner
352

Ofte stillede spørgsmål

Er lektionen “Locale-bevidst typeinferens” gratis?

Ja — hele teksten til “Locale-bevidst typeinferens” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af TypeScript Academy-kurset, skal du opgradere til CoddyKit PRO. TypeScript Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Locale-bevidst typeinferens”?

Sørg for, at alle locales har samme nøglestruktur Du øver dig i TypeScript Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på TypeScript Academy?

Der kræves ingen tidligere erfaring. TypeScript Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Locale-bevidst typeinferens”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne TypeScript Academy-lektion?

Ja. Alle TypeScript Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Typning af oversættelsesnøgler
  2. Typesikkerhed ved interpolation
  3. Pluralisering med typer
  4. Locale-bevidst typeinferens
← Tilbage til TypeScript Academy