DEV Community

Cover image for Manipulação Avançada de Tipos com Utility Types
Levy Henrique Alves Nunes
Levy Henrique Alves Nunes

Posted on

Manipulação Avançada de Tipos com Utility Types

Manipulação Avançada de Tipos com Utility Types

Os Utility Types no TypeScript permitem uma forma de transformar tipos de maneira modular e reutilizável. Alguns dos utility types mais comuns são Partial, Readonly e Record, mas há muitos outros igualmente úteis.

Entendendo Partial, Readonly, Record, e outros

1. Partial<T>

Transforma todas as propriedades de um tipo T em propriedades opcionais.

interface Pessoa {
    nome: string;
    idade: number;
}

type PessoaParcial = Partial<Pessoa>;
// Equivalent a:
// type PessoaParcial = {
//    nome?: string;
//    idade?: number;
// }
Enter fullscreen mode Exit fullscreen mode

2. Readonly<T>

Torna todas as propriedades de um tipo T como somente leitura.

type PessoaReadonly = Readonly<Pessoa>;
// Equivalent a:
// type PessoaReadonly = {
//    readonly nome: string;
//    readonly idade: number;
// }
Enter fullscreen mode Exit fullscreen mode

3. Record<K,T>

Cria um tipo com um conjunto de propriedades K e um tipo de valor T.

type DictionaryNumeros = Record<string, number>;
// Representa um objeto onde as chaves são strings e os valores são números
Enter fullscreen mode Exit fullscreen mode

Casos práticos: transformando tipos com utility types

1. Atualização Parcial

Suponha que você esteja criando uma função para atualizar os detalhes de um usuário. Usando Partial, você pode criar um tipo que representa um subconjunto dos detalhes do usuário:

interface Usuario {
    id: number;
    nome: string;
    email: string;
}

function atualizarUsuario(id: number, detalhes: Partial<Usuario>) {
    // atualiza o usuário no banco de dados
}
Enter fullscreen mode Exit fullscreen mode

2. Objetos Configuráveis

Utilizando o tipo Record, você pode criar um tipo para representar um objeto de configuração onde todas as chaves são strings e todos os valores seguem um tipo específico:

type Configuracoes = Record<string, string | number | boolean>;

function aplicarConfiguracoes(config: Configuracoes) {
    // aplica as configurações
}
Enter fullscreen mode Exit fullscreen mode

3. Objetos Imutáveis

Para garantir que um objeto não seja modificado após ser criado, você pode usar Readonly:

const userReadonly: Readonly<Usuario> = {
    id: 1,
    nome: "João",
    email: "joao@example.com"
};

// A seguinte linha resultará em erro
// userReadonly.nome = "Pedro";
Enter fullscreen mode Exit fullscreen mode

Outros Utility Types úteis:

  • Pick<T, K extends keyof T>: Cria um tipo selecionando um conjunto de propriedades K de T.
  • Omit<T, K extends keyof T>: Cria um tipo removendo um conjunto de propriedades K de T.
  • Exclude<T, U>: Exclui os tipos de U de T.
  • Extract<T, U>: Seleciona os tipos de T que podem ser atribuídos a U.
  • ReturnType<T>: Obtem o tipo de retorno de uma função.

Conclusão

Os Utility Types em TypeScript fornecem uma série de ferramentas poderosas para a manipulação de tipos, tornando o sistema de tipos ainda mais flexível e expressivo. Quando você se familiarizar com essas construções, encontrará muitos casos em que elas podem tornar seu código mais limpo e mais seguro.

Top comments (0)