Como criar e usar tipos de utilitários TypeScript

O TypeScript fornece um conjunto de tipos de utilitários ​​que facilitam a transformação e o gerenciamento de tipos existentes. Esses tipos de utilitários integrados permitem que os desenvolvedores manipulem tipos de várias maneiras, ajudando a simplificar o código e evitar repetições. Este guia explora alguns dos tipos de utilitários mais comuns e como eles podem ser criados e usados ​​em um projeto TypeScript.

O que são tipos de utilitários TypeScript?

Tipos utilitários no TypeScript são tipos predefinidos que ajudam a transformar outros tipos. Eles podem ser usados ​​para criar novos tipos com base nos existentes, escolhendo, omitindo ou modificando propriedades. Eles desempenham um papel essencial na manutenção de código limpo e reutilizável.

Tipos de utilitários TypeScript comumente usados

Aqui estão alguns dos tipos de utilitários TypeScript mais comumente usados:

  • Parcial<T> – Torna todas as propriedades do tipo T opcionais.
  • Obrigatório<T> – Torna todas as propriedades do tipo T obrigatórias.
  • Somente leitura<T> – Torna todas as propriedades do tipo T somente leitura.
  • Pick<T, K> – Seleciona um conjunto de propriedades K do tipo T.
  • Omitir<T, K> – Remove um conjunto de propriedades K do tipo T.
  • Record<K, T> – Constrói um tipo de objeto com chaves do tipo K e valores do tipo T.

Exemplo: Usando Partial<T>

O tipo de utilitário Partial torna todas as propriedades de uma interface opcionais. Veja como ele pode ser usado:

interface User {
  name: string;
  age: number;
  email: string;
}

const updateUser = (user: Partial<User>) => {
  // Update logic
};

updateUser({ name: "John" });

Neste exemplo, updateUser aceita um argumento do tipo Partial<User>, o que significa que apenas algumas das propriedades da interface User são necessárias.

Exemplo: Usando Pick<T, K>

O tipo de utilitário Pick permite selecionar um subconjunto de propriedades de um tipo:

interface User {
  name: string;
  age: number;
  email: string;
}

type UserContactInfo = Pick<User, "name" | "email">;

const contactInfo: UserContactInfo = {
  name: "John",
  email: "[email protected]"
};

Aqui, Pick<User, “name” | “email”> cria um novo tipo UserContactInfo com apenas as propriedades name e email da interface original User.

Exemplo: Usando Omit<T, K>

O tipo de utilitário Omit remove propriedades especificadas de um tipo:

interface User {
  name: string;
  age: number;
  email: string;
}

type UserWithoutEmail = Omit<User, "email">;

const user: UserWithoutEmail = {
  name: "John",
  age: 30
};

Neste exemplo, o tipo UserWithoutEmail é criado omitindo a propriedade email da interface User.

Criando tipos de utilitários personalizados

Tipos de utilitários personalizados também podem ser criados usando os recursos de tipo avançados do TypeScript, como tipos condicionais, tipos mapeados e muito mais. Aqui está um exemplo simples de um tipo de utilitário personalizado que torna todas as propriedades opcionais:

type MyPartial<T> = {
  [P in keyof T]?: T[P];
};

interface User {
  name: string;
  age: number;
  email: string;
}

const user: MyPartial<User> = {
  name: "Alice"
};

Este tipo personalizado MyPartial funciona de forma semelhante ao tipo de utilitário Partial integrado do TypeScript.

Conclusão

Os tipos de utilitários TypeScript são um recurso essencial para trabalhar com tipos de forma flexível e reutilizável. Ao aproveitar esses tipos de utilitários, o código pode ser tornado mais conciso e sustentável. Seja usando tipos de utilitários integrados como Partial, Pick e Omit ou criando tipos personalizados, eles aprimoram significativamente o sistema de tipos do TypeScript.