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 em T.
  • 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.