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;
// }
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;
// }
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
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
}
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
}
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";
Outros Utility Types úteis:
-
Pick<T, K extends keyof T>
: Cria um tipo selecionando um conjunto de propriedadesK
deT
. -
Omit<T, K extends keyof T>
: Cria um tipo removendo um conjunto de propriedadesK
deT
. -
Exclude<T, U>
: Exclui os tipos deU
deT
. -
Extract<T, U>
: Seleciona os tipos deT
que podem ser atribuídos aU
. -
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)