Inferência de Tipos Sensível à Localidade
Garanta que todas as localidades compartilhem a mesma estrutura de chaves.
Inferência de Tipos Sensível à Localidade é uma aula grátis de TypeScript Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de TypeScript Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de TypeScript Academy inclui 4 aulas no total.
Inferência de tipos por localidade
Um aplicativo oferece vários locales (en, tr, de...). Queremos um tipo que gere erros quando qualquer localidade não tiver chaves presentes na base, para que as traduções nunca fiquem silenciosamente dessincronizadas.
Uma localidade base
Escolha uma localidade (geralmente en) como estrutura canônica de chaves. Todas as outras localidades devem corresponder à sua estrutura.
const en = {
greeting: "Hello",
cart: { empty: "Empty", checkout: "Checkout" },
} as const;
type Base = typeof en;Restringindo outras localidades
Tipifique cada localidade adicional com a estrutura da base. Uma chave ausente agora é um erro de compilação no arquivo dessa localidade.
const tr: Base = {
greeting: "Merhaba",
cart: { empty: "Bo\u015f", checkout: "\u00d6deme" },
};
// Omitting cart.checkout -> Error: property missingDetectando também chaves extras
Usar o tipo base como anotação também sinaliza chaves desconhecidas que existem em uma localidade, mas não na base, detectando entradas remanescentes ou digitadas incorretamente.
const de: Base = {
greeting: "Hallo",
cart: { empty: "Leer", checkout: "Kasse" },
extra: "oops", // Error: not in Base
};Um auxiliar para definir localidades
Um auxiliar genérico impõe a estrutura enquanto preserva cada valor, oferecendo um local limpo para a definição de cada localidade.
function defineLocale<T extends Base>(loc: T): T {
return loc;
}
const fr = defineLocale({
greeting: "Bonjour",
cart: { empty: "Vide", checkout: "Paiement" },
});Um registro de todos os locales
Colete locales em um registro. Restringir cada valor a Base garante uma estrutura uniforme em todo o aplicativo.
const locales: Record<string, Base> = { en, tr, de: fr };
// every entry must have the full Base key structureIgualdade em nível de tipos (profunda)
Para obter garantias mais rigorosas, você pode criar um tipo SameKeys que compara profundamente as estruturas de chaves e resulta em um tipo de erro quando elas diferem, indo além do que uma anotação simples detecta.
type SameKeys<A, B> =
keyof A extends keyof B
? keyof B extends keyof A ? true : false
: false;Derivando chaves uma vez
Como todas as localidades compartilham Base, o tipo de caminho de chaves (da lição anterior) é calculado uma vez a partir de Base e reutilizado para cada localidade, portanto a tipagem de t independe da localidade.
type Key = LeafPaths<Base>;
// same valid keys regardless of active localeSeleção de localidade em tempo de execução
Em tempo de execução, você indexa o registro pela localidade ativa; o sistema de tipos já garantiu que cada localidade tem as mesmas chaves, portanto as consultas são seguras.
function translate(locale: keyof typeof locales, key: Key): string {
return getPath(locales[locale], key);
}Detectando chaves ausentes entre localidades
Se não puder anotar cada arquivo diretamente (por exemplo, importações JSON), uma verificação de tipos em tempo de compilação compara cada localidade importada com Base e apresenta um tipo de diferença que lista as chaves ausentes.
type Missing<L> = Exclude<keyof Base, keyof L>;
type TrMissing = Missing<typeof tr>; // never if completePor que isso importa
A i18n sem tipos apresenta divergências: uma chave adicionada a en é esquecida em de, enviando um texto vazio ou em inglês. Restringir cada localidade a uma base compartilhada transforma essa omissão em um erro de compilação, mantendo todos os locales completos e consistentes.
Verificação rápida
Confirme sua compreensão da inferência por localidade.
Recapitulação
Você escolheu uma localidade base como estrutura canônica e restringiu todas as outras localidades a ela, de modo que chaves ausentes ou extras impeçam a compilação. Um auxiliar defineLocale e um registro restrito mantêm todos os locales estruturalmente idênticos, e os caminhos de chaves são derivados uma vez a partir da base.
Perguntas Frequentes
A aula “Inferência de Tipos Sensível à Localidade” é grátis?
Sim — o texto completo de “Inferência de Tipos Sensível à Localidade” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de TypeScript Academy, atualize para CoddyKit PRO. O curso de TypeScript Academy inclui 4 aulas no total.
O que vou aprender em “Inferência de Tipos Sensível à Localidade”?
Garanta que todas as localidades compartilhem a mesma estrutura de chaves. Você pratica TypeScript Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar TypeScript Academy?
Nenhuma experiência prévia é necessária. TypeScript Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Inferência de Tipos Sensível à Localidade”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de TypeScript Academy?
Sim. Cada aula de TypeScript Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Definindo Tipos para Chaves de Tradução
- Segurança de Tipos na Interpolação
- Pluralização com Tipos
- Inferência de Tipos Sensível à Localidade