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;
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
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
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";
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>;
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"
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
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)