spinny:~/writing $ less advanced-typescript-patterns.md
12TypeScript se tornou o padrão da indústria para desenvolvimento web em grande escala. Embora a maioria dos desenvolvedores conheça o básico de interfaces e tipos, o verdadeiro poder está no seu sistema de tipos avançado. Aqui estão 5 padrões que irão distingui-lo como engenheiro sênior.34## 1. Generic Constraints56Generics são poderosos, mas às vezes você precisa limitar o que pode ser passado. `extends` é seu aliado aqui.78```typescript9interface HasId {10 id: string;11}1213function getById<T extends HasId>(list: T[], id: string): T | undefined {14 return list.find((item) => item.id === id);15}16```1718Ao garantir que `T` estende `HasId`, garantimos que acessar `.id` dentro da função é seguro.1920## 2. Conditional Types2122Tipos condicionais permitem criar mapeamentos de tipos não uniformes. A sintaxe é semelhante ao operador ternário em JavaScript.2324```typescript25type IsString<T> = T extends string ? true : false;2627type A = IsString<string>; // true28type B = IsString<number>; // false29```3031Um caso de uso prático é filtrar tipos de uma union:3233```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```3738## 3. Mapped Types3940Mapped types permitem criar novos tipos baseados em tipos existentes, transformando propriedades.4142```typescript43type ReadOnly<T> = {44 readonly [P in keyof T]: T[P];45};4647interface User {48 name: string;49 age: number;50}5152type ReadOnlyUser = ReadOnly<User>;53```5455Você pode até adicionar ou remover modificadores:5657```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```6263## 4. Template Literal Types6465Introduzidos no TypeScript 4.1, eles permitem manipular tipos de string diretamente.6667```typescript68type World = 'world';69type Greeting = `hello ${World}`; // "hello world"7071type Color = 'red' | 'blue';72type Quantity = 'light' | 'dark';7374type Palette = `${Quantity}-${Color}`;75// "light-red" | "light-blue" | "dark-red" | "dark-blue"76```7778Isso é incrivelmente útil para tipar strings que seguem um padrão específico, como classes CSS ou nomes de eventos.7980## 5. A Palavra-chave `infer`8182A palavra-chave `infer` dentro de tipos condicionais permite extrair tipos de outros tipos.8384```typescript85type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;8687function check(): boolean {88 return true;89}9091type CheckReturn = ReturnType<typeof check>; // boolean92```9394Aqui, estamos pedindo ao TypeScript para "inferir" o tipo de retorno `R` de uma função e retorná-lo.9596## Conclusão9798Dominar esses padrões permite escrever bibliotecas e utilitários que são robustos e proporcionam uma excelente experiência para o desenvolvedor (DX). O objetivo do TypeScript avançado não é complexidade pela complexidade, mas sim segurança e expressividade.99
:5 Padrões Avançados de TypeScript para Engenheiros Senioreslines 1-99 (END) — press q to close