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

Tipos condicionais e inferência

Os tipos condicionais permitem expressar decisões de tipo não triviais com base em relacionamentos de herança. A sintaxe se assemelha ao operador ternário do JavaScript:

TS
T extends U ? X : Y

Se o tipo T for atribuível a U, então o tipo resultante será X, caso contrário será Y.


Tipos Condicionais Básicos

Um tipo condicional avalia uma condição em tempo de compilação:

TS
type IsNumber<T> = T extends number ? true : false;

type A = IsNumber<number>; // true
type B = IsNumber<string>; // false

Esse padrão é extremamente poderoso quando combinado com genéricos para criar tipos de utilitários flexíveis e dinâmicos.


Extração de tipo com infer

Dentro da cláusula extends de um tipo condicional, podemos usar a palavra-chave infer para declarar uma variável de tipo a ser inferida pelo compilador.

Por exemplo, se quisermos extrair o tipo de retorno de uma função:

TS
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

type ExampleFunction = () => string;
type Return = GetReturnType<ExampleFunction>; // string

Neste exemplo, infer R diz ao TypeScript para determinar automaticamente o tipo de retorno da função e disponibilizá-la como R no ramo positivo da condicional.


Experimente você mesmo

Exercício 1: O tipo IsString

Exercício#ts.m6.l1.e1
Tentativas: 0Carregando…

Crie um tipo genérico chamado IsString<T> que retorna o tipo literal true se T estender string, caso contrário, false.

Carregando editor…
Mostrar dica

Use o tipo de sintaxe IsString<T> = T estende string ? verdadeiro: falso; para verificar o tipo.

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

Exercício 2: Extraindo um tipo de um Array com infer

Exercício#ts.m6.l1.e2
Tentativas: 0Carregando…

Defina um tipo genérico UnpackArray<T> que usa infer para extrair o tipo de elemento de uma matriz T. Se T for uma matriz (por exemplo U[]), retorne U, caso contrário, retorne o mesmo tipo T.

Carregando editor…
Mostrar dica

Use T estende (inferir U)[] ? U : T para declarar e retornar a variável de tipo inferida U.

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