Pular para o conteúdo principal
Módulo 5 · Lição 2 de 210/14 no curso~15 min
Lições do módulo (2/2)

Tipos Literais e Asserções

TypeScript fornece ferramentas avançadas para restringir os valores possíveis de variáveis ​​e forçar o compilador a reconhecer tipos mais específicos quando necessário.

Tipos Literais

Um tipo literal representa um valor único e exato (por exemplo, uma string ou número específico). Eles geralmente são combinados com tipos de união:

TS
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;

light = 'red'; // OK
light = 'blue'; // Error: "blue" is not assignable to TrafficLight

Asserções de tipo (as)

Às vezes você tem informações sobre um tipo que o TypeScript não consegue saber em tempo de compilação. Nestes casos, você pode usar uma asserção de tipo usando a palavra-chave as:

TS
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;

A afirmação diz ao compilador: "Confie em mim, eu sei que este elemento é um HTMLCanvasElement". Ele não realiza nenhuma verificação ou conversão em tempo de execução; isso só ajuda o verificador de tipo.

Asserções Const (as const)

Quando declaramos um objeto ou array com const, o TypeScript ainda permite modificar suas propriedades internas. Ao adicionar as const no final, toda a estrutura é congelada e tornada somente leitura, convertendo todas as propriedades em seus tipos literais exatos:

TS
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Error: array is read-only

Tipos literais de modelo

Os tipos literais de modelo são construídos sobre strings de modelo JavaScript, mas são usados ​​em posições de tipo. Eles permitem combinar vários tipos literais em um:

TS
type Size = 'small' | 'large';
type Color = 'red' | 'blue';

// Creates the union: "small-red" | "small-blue" | "large-red" | "large-blue"
type ItemId = `${Size}-${Color}`;

Utilitários de string em tipos literais de modelo

TypeScript fornece tipos de utilitários especiais para manipular caracteres dentro de tipos literais de modelo:

  • Capitalize<StringType>: Coloca a primeira letra da string em maiúscula.
  • Uncapitalize<StringType>: Descapitaliza a primeira letra da string.
  • Uppercase<StringType>: Converte toda a string em maiúsculas.
  • Lowercase<StringType>: Converte toda a string em minúsculas.
TS
type ActionType = 'click' | 'hover';

// Generates: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;

Experimente você mesmo

Exercício 1: Direção União Literal

Exercício#ts.m5.l2.e1
Tentativas: 0Carregando…

Defina um tipo literal chamado Direction que aceite apenas as strings 'up', 'down', 'left' ou 'right'. Em seguida, declare uma função chamada move(dir: Direction): string que retorna a string 'Moving' seguida pela direção recebida.

Carregando editor…
Mostrar dica

Defina primeiro o alias do tipo com as quatro opções separadas por | e, em seguida, declare a função de movimentação anotando o parâmetro e o tipo de retorno.

Solução disponível após 3 tentativas

Exercício 2: Asserção em JSON.parse

Exercício#ts.m5.l2.e2
Tentativas: 0Carregando…

A função JSON.parse retorna qualquer tipo por padrão. Modifique a função parseUser para que o resultado de JSON.parse(json) seja declarado como tipo { nome de usuário: string } usando a palavra-chave as.

Carregando editor…
Mostrar dica

Adicione 'as {nome de usuário: string}' imediatamente após a chamada JSON.parse(json).

Solução disponível após 3 tentativas

Exercício 3: Literal de modelo para eventos

Exercício#ts.m5.l2.e3
Tentativas: 0Carregando…

Dados os tipos Status e Ação, defina um tipo de string de modelo denominado Evento no formato 'Status-Action' (por exemplo, 'open-click').

Carregando editor…
Mostrar dica

Use crases para definir o tipo e a sintaxe ${Status}-${Action} interna.

Solução disponível após 3 tentativas

Exercício 4: Tipo Literal de Modelo com Capitalização

Exercício#ts.m5.l2.e4
Tentativas: 0Carregando…

Defina um evento de tipo literal que pode ser 'clique' ou 'passar o mouse'. Em seguida, use Template Literal Types para declarar um tipo EventHandler representando strings no formato on seguido pelo nome do evento em maiúscula (ou seja, 'onClick' ou 'onHover').

Carregando editor…
Mostrar dica

Use Capitalize<Event> dentro do literal do modelo para colocar a primeira letra do evento em maiúscula.

Solução disponível após 3 tentativas