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:
T extends U ? X : YSe 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:
type IsNumber<T> = T extends number ? true : false;
type A = IsNumber<number>; // true
type B = IsNumber<string>; // falseEsse 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:
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type ExampleFunction = () => string;
type Return = GetReturnType<ExampleFunction>; // stringNeste 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
Crie um tipo genérico chamado IsString<T> que retorna o tipo literal true se T estender string, caso contrário, false.
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
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.
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