DEV Community

Cover image for Tipos Avançados em TypeScript
Levy Henrique Alves Nunes
Levy Henrique Alves Nunes

Posted on

Tipos Avançados em TypeScript

TypeScript, sendo uma superconjunto de JavaScript, fornece uma camada robusta de recursos de tipagem que nos permitem escrever código de maneira mais segura e previsível. Um desses recursos é o conjunto de tipos avançados. Vamos explorar alguns dos mais notáveis: tipos de união e interseção, tipos literais e mapeamento de tipos, e o tipo condicional e infer.

1. Tipos de União e Interseção

1.1 Tipos de União (Union Types)

Um tipo de união é uma maneira de dizer que um valor pode ser de um de vários tipos. Por exemplo:

type StringOrNumber = string | number;
Enter fullscreen mode Exit fullscreen mode

Isso significa que a variável que tem esse tipo pode ser tanto uma string quanto um número.

let value: StringOrNumber;
value = 123;  // válido
value = "abc"; // válido
value = true; // erro
Enter fullscreen mode Exit fullscreen mode

1.2 Tipos de Interseção (Intersection Types)

Enquanto um tipo de união indica que um valor pode ser de um tipo ou outro, um tipo de interseção combina múltiplos tipos em um:

type Named = {
  name: string;
}

type Aged = {
  age: number;
}

type Person = Named & Aged;

const person: Person = { name: "Alice", age: 30 }; // válido
Enter fullscreen mode Exit fullscreen mode

2. Tipos Literais e Mapeamento de Tipos

2.1 Tipos Literais (Literal Types)

Um tipo literal é uma maneira de definir um tipo que só aceita um valor específico. Por exemplo:

type ButtonType = "submit" | "reset";
Enter fullscreen mode Exit fullscreen mode

Isto significa que só aceitamos as strings "submit" ou "reset" para este tipo.

2.2 Mapeamento de Tipos (Mapped Types)

Mapeamento de tipos nos permite criar novos tipos com base em propriedades de um tipo existente:

type ReadOnly<T> = {
  readonly [K in keyof T]: T[K];
}

type User = {
  name: string;
  age: number;
}

type UserReadOnly = ReadOnly<User>;
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, UserReadOnly será um tipo onde todas as propriedades são somente leitura.

3. Tipo Condicional e infer

Tipo Condicional

Os tipos condicionais nos permitem escolher um tipo com base em uma condição:

type IsString<T> = T extends string ? "yes" : "no";
type Test = IsString<number>; // "no"
Enter fullscreen mode Exit fullscreen mode

Infer

A palavra-chave infer nos permite inferir um tipo dentro do escopo do tipo condicional:

type ExtractArrayElementType<T> = T extends (infer U)[] ? U : never;

type ElementType = ExtractArrayElementType<string[]>; // string
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, inferimos o tipo do elemento do array, que é string, e atribuímos a ElementType.

Conclusão

TypeScript, com seus tipos avançados, nos oferece uma ferramenta poderosa para escrever código mais seguro e auto-documentado. Esses recursos avançados de tipagem, quando usados corretamente, podem reduzir significativamente a probabilidade de erros em tempo de execução e tornar nossas aplicações mais robustas.

Top comments (0)