Introdução aos tipos mapeados do TypeScript
Tipos mapeados em TypeScript fornecem uma maneira de criar novos tipos transformando os existentes. Eles são uma ferramenta poderosa para lidar com operações de tipos complexas e garantir a segurança de tipos em aplicativos TypeScript. Este artigo apresenta tipos mapeados, explica sua sintaxe e fornece exemplos para demonstrar seu uso.
O que são tipos mapeados?
Tipos mapeados permitem a criação de novos tipos aplicando uma transformação a cada propriedade de um tipo existente. Eles são frequentemente usados para modificar ou estender tipos de forma flexível. A sintaxe básica de um tipo mapeado é:
type MappedType = {
[K in keyof T]: NewType;
};
Nesta sintaxe:
T
é o tipo original.K
representa cada tonalidade emT
.NewType
é o novo tipo atribuído a cada propriedade.
Exemplo básico de tipos mapeados
Aqui está um exemplo simples de um tipo mapeado que converte todas as propriedades de um determinado tipo para somente leitura:
type ReadOnly = {
readonly [K in keyof T]: T[K];
};
type User = {
name: string;
age: number;
};
type ReadOnlyUser = ReadOnly;
Neste exemplo, o tipo mapeado ReadOnly
transforma todas as propriedades do tipo User
para somente leitura, resultando em um novo tipo ReadOnlyUser
onde todas as propriedades são imutáveis.
Tipos mapeados com transformações de tipo
Tipos mapeados também podem ser usados para transformar tipos de maneiras mais complexas. Por exemplo, um tipo mapeado que torna todas as propriedades opcionais:
type Partial = {
[K in keyof T]?: T[K];
};
type User = {
name: string;
age: number;
};
type PartialUser = Partial;
Neste exemplo, o tipo mapeado Partial
torna todas as propriedades do tipo User
opcionais, resultando em um novo tipo PartialUser
onde cada propriedade é opcional.
Usando tipos mapeados com tipos condicionais
Tipos mapeados podem ser combinados com tipos condicionais para operações de tipo mais sofisticadas. Por exemplo, criar um tipo que inclua apenas propriedades de um determinado tipo:
type OnlyStrings = {
[K in keyof T]: T[K] extends string ? T[K] : never;
};
type User = {
name: string;
age: number;
email: string;
};
type StringProperties = OnlyStrings;
Neste exemplo, o tipo mapeado OnlyStrings
filtra propriedades que não são do tipo string
, resultando em um novo tipo StringProperties
que inclui apenas propriedades de string do tipo User
.
Tipos Mapeados Avançados
Casos de uso avançados para tipos mapeados incluem a criação de tipos que modificam tipos existentes com base em várias condições. Por exemplo, um tipo mapeado que adiciona um sufixo a cada nome de propriedade:
type WithSuffix<T, S extends string> = {
[K in keyof T as `${string & K}${S}`]: T[K];
};
type User = {
name: string;
age: number;
};
type UserWithSuffix = WithSuffix<User, "Prop">;
Neste exemplo, o tipo mapeado WithSuffix
adiciona um sufixo a cada nome de propriedade do tipo User
, resultando em um novo tipo UserWithSuffix
onde os nomes de propriedade têm o sufixo especificado.
Conclusão
Tipos mapeados no TypeScript são um recurso versátil que permite que os desenvolvedores criem novos tipos transformando os existentes. Ao entender e utilizar tipos mapeados, os desenvolvedores podem gerenciar transformações de tipos complexas e garantir maior segurança de tipos em seu código TypeScript. Tipos mapeados oferecem recursos poderosos para aprimorar e personalizar definições de tipos em aplicativos TypeScript.