spinny:~/writing $ vim advanced-typescript-patterns.md
1~2TypeScript se ha convertido en el estándar de la industria para el desarrollo web a gran escala. Si bien la mayoría de los desarrolladores conocen los conceptos básicos de interfaces y tipos, el verdadero poder reside en su sistema de tipos avanzado. Aquí hay 5 patrones que te distinguirán como ingeniero senior.3~4## 1. Restricciones Genéricas5~6Los genéricos son poderosos, pero a veces necesitas limitar lo que se puede pasar. `extends` es tu amigo aquí.7~8```typescript9interface HasId {10 id: string;11}12~13function getById<T extends HasId>(list: T[], id: string): T | undefined {14 return list.find((item) => item.id === id);15}16```17~18Al asegurar que `T` extiende `HasId`, garantizamos que acceder a `.id` dentro de la función es seguro.19~20## 2. Tipos Condicionales21~22Los tipos condicionales te permiten crear mapeos de tipos no uniformes. La sintaxis es similar al operador ternario en JavaScript.23~24```typescript25type IsString<T> = T extends string ? true : false;26~27type A = IsString<string>; // true28type B = IsString<number>; // false29```30~31Un caso de uso práctico es filtrar tipos de una unión:32~33```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```37~38## 3. Tipos Mapeados39~40Los tipos mapeados te permiten crear nuevos tipos basados en los antiguos transformando propiedades.41~42```typescript43type ReadOnly<T> = {44 readonly [P in keyof T]: T[P];45};46~47interface User {48 name: string;49 age: number;50}51~52type ReadOnlyUser = ReadOnly<User>;53```54~55Incluso puedes agregar o eliminar modificadores:56~57```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```62~63## 4. Tipos Literales de Plantilla64~65Introducidos en TypeScript 4.1, estos te permiten manipular tipos de cadenas directamente.66~67```typescript68type World = 'world';69type Greeting = `hello ${World}`; // "hello world"70~71type Color = 'red' | 'blue';72type Quantity = 'light' | 'dark';73~74type Palette = `${Quantity}-${Color}`;75// "light-red" | "light-blue" | "dark-red" | "dark-blue"76```77~78Esto es increíblemente útil para tipificar cadenas que siguen un patrón específico, como clases CSS o nombres de eventos.79~80## 5. La Palabra Clave `infer`81~82La palabra clave `infer` dentro de los tipos condicionales te permite extraer tipos de otros tipos.83~84```typescript85type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;86~87function check(): boolean {88 return true;89}90~91type CheckReturn = ReturnType<typeof check>; // boolean92```93~94Aquí, le pedimos a TypeScript que "infiera" el tipo de retorno `R` de una función y lo devuelva.95~96## Conclusión97~98Dominar estos patrones te permite escribir bibliotecas y utilidades que son robustas y brindan una excelente experiencia de desarrollador (DX). El objetivo de TypeScript avanzado no es la complejidad por la complejidad, sino la seguridad y la expresividad.99~
NORMAL · advanced-typescript-patterns.md [readonly]99 lines · :q to close