Segurança de Tipos na Interpolação
Extraia e exija variáveis de interpolação a partir de textos.
Segurança de Tipos na Interpolação é uma aula grátis de TypeScript Academy no CoddyKit. Esta é a aula 2 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.
Interpolação com segurança de tipos
As mensagens geralmente contêm marcadores de posição, como "Hello, {name}". A i18n com segurança de tipos extrai os nomes desses marcadores do tipo string da mensagem e exige que você passe os argumentos correspondentes.
O objetivo
Dado o tipo literal de uma mensagem, queremos calcular o objeto de variáveis de que ela precisa, para que t("greet", { name: "Ada" }) seja exigido e a ausência de name gere um erro de compilação.
Extraindo um marcador de posição
Um tipo condicional de literal de modelo extrai o nome da variável de uma string com um único marcador de posição. No código real, o padrão é escrito com crases como: string, chave de abertura, variável inferida V, chave de fechamento, string. Denotamos esse comparador como BraceMatch abaixo.
// Real TS pattern (backtick template literal):
// matches any text, then {V}, then any text; infers V.
type Var<S extends string> =
S extends BraceMatch<infer V> ? V : never;
type A = Var<"Hello, {name}">; // "name"Extraindo vários marcadores de posição
Recurses para coletar cada marcador de posição em uma união. O padrão captura uma variável e a parte restante, depois recursa sobre o restante.
// Pattern: any text, {V}, then Rest tail -- infer V and Rest.
type Vars<S extends string> =
S extends BraceMatchRest<infer V, infer Rest>
? V | Vars<Rest>
: never;
type B = Vars<"Hi {first} {last}!">; // "first" | "last"Dos nomes a um objeto de argumentos
Transforme a união de nomes em um tipo de objeto obrigatório com um tipo mapeado.
type ArgsOf<S extends string> = {
[K in Vars<S>]: string | number;
};
type G = ArgsOf<"Hello, {name}">;
// { name: string | number }Sem marcadores, sem argumentos
Quando uma mensagem não tem marcadores de posição, Vars é never, portanto o objeto de argumentos fica vazio. Nesse caso, podemos tornar o parâmetro de argumentos opcional.
type C = Vars<"Goodbye">; // never
type D = ArgsOf<"Goodbye">; // {} (empty)Uma função de tradução tipada
Faça o parâmetro de argumentos depender da chave escolhida, consultando o literal da mensagem e calculando seus argumentos.
declare const messages: {
greet: "Hello, {name}";
invite: "Join {count} others";
};
declare function t<K extends keyof typeof messages>(
key: K,
args: ArgsOf<(typeof messages)[K]>
): string;A aplicação da verificação
Agora o compilador exige exatamente as variáveis declaradas por cada mensagem.
t("greet", { name: "Ada" }); // ok
t("greet", {}); // Error: name is missing
t("invite", { count: 3 }); // ok
t("invite", { name: "x" }); // Error: count missing, name unexpectedArgumentos opcionais para mensagens simples
Use uma sobrecarga condicional para que mensagens sem marcadores de posição não exijam um segundo argumento.
type MaybeArgs<S extends string> =
Vars<S> extends never ? [] : [args: ArgsOf<S>];
declare function t2<K extends keyof typeof messages>(
key: K,
...rest: MaybeArgs<(typeof messages)[K]>
): string;Delimitadores personalizados
Se o seu catálogo usa {{name}} ou %{name}, ajuste o padrão de literal de modelo em Vars de acordo. A técnica é a mesma; apenas o literal ao redor muda.
Por que isso importa
Variáveis de interpolação ausentes ou digitadas incorretamente são uma fonte clássica de textos quebrados na interface ("Hello, undefined"). Extraí-las em nível de tipos transforma esses casos em erros de compilação e documenta o contrato de cada mensagem.
Verificação rápida
Teste sua compreensão da segurança de tipos na interpolação.
Recapitulação
Ao comparar tipos literais de mensagem por padrões usando literais de modelo e infer, você extrai os nomes dos marcadores para uma união, mapeia-os para um objeto de argumentos obrigatórios e faz a função de tradução exigir exatamente essas variáveis, sendo opcional quando não houver nenhuma.
Perguntas Frequentes
A aula “Segurança de Tipos na Interpolação” é grátis?
Sim — o texto completo de “Segurança de Tipos na Interpolação” é 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 “Segurança de Tipos na Interpolação”?
Extraia e exija variáveis de interpolação a partir de textos. 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 2 de 4.
Quanto tempo leva a aula “Segurança de Tipos na Interpolação”?
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