0Pricing
TypeScript Academy · Aula

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 unexpected

Argumentos 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

  1. Definindo Tipos para Chaves de Tradução
  2. Segurança de Tipos na Interpolação
  3. Pluralização com Tipos
  4. Inferência de Tipos Sensível à Localidade
← Voltar para TypeScript Academy