DEV Community

Cover image for Tipos condicionais no TypeScript: exemplos práticos e uso avançado
Angéllica Araujo
Angéllica Araujo

Posted on • Edited on

7 1 1

Tipos condicionais no TypeScript: exemplos práticos e uso avançado

Com os tipos condicionais, um recurso poderoso do TypeScript, é possível criar tipos que dependem de outros tipos. Os tipos condicionais são avaliados em tempo de compilação e são definidos usando um operador ternário que especifica uma condição, e o ponto de interrogação indica que o tipo é condicional.

A sintaxe para um tipo condicional é a seguinte:

T extends U ? X : Y
Enter fullscreen mode Exit fullscreen mode

Aqui, T e U são tipos, X e Y são tipos ou expressões de tipo, e extends é uma palavra-chave que especifica uma restrição em T.

Um caso de uso comum para tipos condicionais é extrair propriedades de objetos. Por exemplo, considere a seguinte interface:

interface User {
  id: number;
  name: string;
  email: string;
}
Enter fullscreen mode Exit fullscreen mode

Podemos criar um tipo que extrai as chaves de User da seguinte forma:

type UserKeys = keyof User; // "id" | "name" | "email"
Enter fullscreen mode Exit fullscreen mode

Usando um tipo condicional, podemos criar uma versão mais flexível de UserKeys que pode extrair chaves de qualquer tipo de objeto:

type KeysOfType<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never;
}[keyof T];
Enter fullscreen mode Exit fullscreen mode

Aqui, KeysOfType recebe dois parâmetros de tipo, T e U, e retorna uma união de chaves de T cujos valores são do tipo U. Por exemplo:

interface Car {
  make: string;
  model: string;
  year: number;
}

type StringKeys = KeysOfType<Car, string>; // "make" | "model"
Enter fullscreen mode Exit fullscreen mode

Esse tipo retorna "make" e "model", pois essas são as chaves de Car cujos valores são do tipo string.

Outro caso de uso para tipos condicionais é verificar se um tipo é um array. O TypeScript fornece um tipo Array integrado, mas às vezes precisamos verificar se um valor é um array em tempo de execução. Podemos criar um tipo que verifica se um tipo é um array da seguinte forma:

type IsArray<T> = T extends any[] ? true : false;
Enter fullscreen mode Exit fullscreen mode

Aqui, IsArray recebe um parâmetro de tipo T e retorna um booleano indicando se T é um tipo de array. Por exemplo:

type A = IsArray<number[]>; // true
type B = IsArray<string>; // false
Enter fullscreen mode Exit fullscreen mode

Os tipos condicionais também suportam a palavra-chave infer, que nos permite inferir um tipo de outro tipo. Por exemplo, considere o seguinte tipo:

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
Enter fullscreen mode Exit fullscreen mode

Aqui, ReturnType recebe um tipo de função T e retorna o tipo de retorno de T. Por exemplo:

function add(a: number, b: number): number {
  return a + b;
}

type Result = ReturnType<typeof add>; // number
Enter fullscreen mode Exit fullscreen mode

Este tipo retorna number, pois esse é o tipo de retorno da função add.

Além disso, a página aborda como combinar tipos condicionais com outros recursos do TypeScript, como tipos genéricos e uniões de tipos. Por exemplo, podemos criar um tipo que verifica se um tipo é uma união de tipos de objeto da seguinte forma:

type IsObjectUnion<T> = T extends object ? T[keyof T] : never;

type ExampleUnion = { a: string } | { b: number };

type Result = IsObjectUnion<ExampleUnion>; // string | number
Enter fullscreen mode Exit fullscreen mode

Este tipo retorna string | number, pois ExampleUnion é uma união de tipos de objeto que contém a: string e b: number.

Conclusão

Os tipos condicionais são uma ferramenta poderosa do TypeScript para tipos mais flexíveis e precisos. Com os tipos condicionais, é possível extrair propriedades de objetos, verificar se um tipo é um array e inferir tipos de outros tipos, além de combinar tipos condicionais com outros recursos do TypeScript para criar tipos mais complexos e úteis.

Referências

Documentação oficial: https://www.typescriptlang.org/
Créditos da imagem: https://brandontle.com/writing/why-typescript/
Introdução prática: https://auth0.com/blog/working-with-typeScript-a-practical-introduction/

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (2)

Collapse
 
renancferro profile image
Renan Ferro • Edited

Nice artigo, generic type é uma parada maravilhosa demais quando estamos em cenários não muito padronizados 💪🏻

Só um ponto, se você quiser em seus code blocks você pode especificar o tipo após abrir-lo, tipo:

Image description

Apenas um toque, ta 😅

Collapse
 
angellicaaraujo profile image
Angéllica Araujo

@renancferro muitissimo obrigada pela dica! Também o meu obrigada pelo feedback, significa muito para mim como profissional na área. Todas as revisões, atualizações e melhorias são muito bem-vindas! Grata! 🤩

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay