ASD

Typescript Advanced Types

Domina el sistema de tipos avanzado de TypeScript: generics, tipos condicionales, mapped types, template literals y utility types para aplicaciones type-safe.

Estrellas
38.8k

en todo el repo

Actividad
47

0–100, la ruta de este skill

Actualizado
hace 2 meses

último commit aquí

Commits
1

últimos 90 días

Contexto
2k tok

76 tok en reposo

Paquete
2 archivos

17 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add wshobson/agents --skill typescript-advanced-types --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Aplica generics, tipos condicionales, mapped types y template literal types en TypeScript
  • Construye utilidades de tipos reutilizables y sistemas de inferencia complejos
  • Aporta buenas prácticas y errores comunes al diseñar tipos avanzados

Úsalo cuando

  • Construir librerías o frameworks type-safe
  • Crear componentes genéricos reutilizables
  • Implementar lógica de inferencia de tipos compleja
  • Migrar código JavaScript a TypeScript

No lo uses cuando

    Qué lo activa

    Di cualquiera de estas frases y el agente debería cargar este skill.

    • Ayúdame a crear un tipo genérico con restricciones en TypeScript
    • Necesito un mapped type para transformar las propiedades de una interfaz
    • Cómo hago inferencia de tipos con conditional types en TypeScript

    SKILL.md

    En inglés

    TypeScript Advanced Types

    Comprehensive guidance for mastering TypeScript's advanced type system including generics, conditional types, mapped types, template literal types, and utility types for building robust, type-safe applications.

    When to Use This Skill

    • Building type-safe libraries or frameworks
    • Creating reusable generic components
    • Implementing complex type inference logic
    • Designing type-safe API clients
    • Building form validation systems
    • Creating strongly-typed configuration objects
    • Implementing type-safe state management
    • Migrating JavaScript codebases to TypeScript

    Core Concepts

    1. Generics

    Purpose: Create reusable, type-flexible components while maintaining type safety.

    Basic Generic Function:

    function identity<T>(value: T): T {
      return value;
    }
    
    const num = identity<number>(42); // Type: number
    const str = identity<string>("hello"); // Type: string
    const auto = identity(true); // Type inferred: boolean
    

    Generic Constraints:

    interface HasLength {
      length: number;
    }
    
    function logLength<T extends HasLength>(item: T): T {
      console.log(item.length);
      return item;
    }
    
    logLength("hello"); // OK: string has length
    logLength([1, 2, 3]); // OK: array has length
    logLength({ length: 10 }); // OK: object has length
    // logLength(42);             // Error: number has no length
    

    Multiple Type Parameters:

    function merge<T, U>(obj1: T, obj2: U): T & U {
      return { ...obj1, ...obj2 };
    }
    
    const merged = merge({ name: "John" }, { age: 30 });
    // Type: { name: string } & { age: number }
    

    2. Conditional Types

    Purpose: Create types that depend on conditions, enabling sophisticated type logic.

    Basic Conditional Type:

    type IsString<T> = T extends string ? true : false;
    
    type A = IsString<string>; // true
    type B = IsString<number>; // false
    

    Extracting Return Types:

    type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
    
    function getUser() {
      return { id: 1, name: "John" };
    }
    
    type User = ReturnType<typeof getUser>;
    // Type: { id: number; name: string; }
    

    Distributive Conditional Types:

    type ToArray<T> = T extends any ? T[] : never;
    
    type StrOrNumArray = ToArray<string | number>;
    // Type: string[] | number[]
    

    Nested Conditions:

    type TypeName<T> = T extends string
      ? "string"
      : T extends number
        ? "number"
        : T extends boolean
          ? "boolean"
          : T extends undefined
            ? "undefined"
            : T extends Function
              ? "function"
              : "object";
    
    type T1 = TypeName<string>; // "string"
    type T2 = TypeName<() => void>; // "function"
    

    3. Mapped Types

    Purpose: Transform existing types by iterating over their properties.

    Basic Mapped Type:

    type Readonly<T> = {
      readonly [P in keyof T]: T[P];
    };
    
    interface User {
      id: number;
      name: string;
    }
    
    type ReadonlyUser = Readonly<User>;
    // Type: { readonly id: number; readonly name: string; }
    

    Optional Properties:

    type Partial<T> = {
      [P in keyof T]?: T[P];
    };
    
    type PartialUser = Partial<User>;
    // Type: { id?: number; name?: string; }
    

    Key Remapping:

    type Getters<T> = {
      [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
    };
    
    interface Person {
      name: string;
      age: number;
    }
    
    type PersonGetters = Getters<Person>;
    // Type: { getName: () => string; getAge: () => number; }
    

    Filtering Properties:

    type PickByType<T, U> = {
      [K in keyof T as T[K] extends U ? K : never]: T[K];
    };
    
    interface Mixed {
      id: number;
      name: string;
      age: number;
      active: boolean;
    }
    
    type OnlyNumbers = PickByType<Mixed, number>;
    // Type: { id: number; age: number; }
    

    4. Template Literal Types

    Purpose: Create string-based types with pattern matching and transformation.

    Basic Template Literal:

    type EventName = "click" | "focus" | "blur";
    type EventHandler = `on${Capitalize<EventName>}`;
    // Type: "onClick" | "onFocus" | "onBlur"
    

    String Manipulation:

    type UppercaseGreeting = Uppercase<"hello">; // "HELLO"
    type LowercaseGreeting = Lowercase<"HELLO">; // "hello"
    type CapitalizedName = Capitalize<"john">; // "John"
    type UncapitalizedName = Uncapitalize<"John">; // "john"
    

    Path Building:

    type Path<T> = T extends object
      ? {
          [K in keyof T]: K extends string ? `${K}` | `${K}.${Path<T[K]>}` : never;
        }[keyof T]
      : never;
    
    interface Config {
      server: {
        host: string;
        port: number;
      };
      database: {
        url: string;
      };
    }
    
    type ConfigPath = Path<Config>;
    // Type: "server" | "database" | "server.host" | "server.port" | "database.url"
    

    5. Utility Types

    Built-in Utility Types:

    // Partial<T> - Make all properties optional
    type PartialUser = Partial<User>;
    
    // Required<T> - Make all properties required
    type RequiredUser = Required<PartialUser>;
    
    // Readonly<T> - Make all properties readonly
    type ReadonlyUser = Readonly<User>;
    
    // Pick<T, K> - Select specific properties
    type UserName = Pick<User, "name" | "email">;
    
    // Omit<T, K> - Remove specific properties
    type UserWithoutPassword = Omit<User, "password">;
    
    // Exclude<T, U> - Exclude types from union
    type T1 = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
    
    // Extract<T, U> - Extract types from union
    type T2 = Extract<"a" | "b" | "c", "a" | "b">; // "a" | "b"
    
    // NonNullable<T> - Exclude null and undefined
    type T3 = NonNullable<string | null | undefined>; // string
    
    // Record<K, T> - Create object type with keys K and values T
    type PageInfo = Record<"home" | "about", { title: string }>;
    

    Detailed worked examples and patterns

    Detailed sections (starting with ## Advanced Patterns) live in references/details.md. Read that file when the navigation summary above is insufficient.

    Best Practices

    1. Use unknown over any: Enforce type checking
    2. Prefer interface for object shapes: Better error messages
    3. Use type for unions and complex types: More flexible
    4. Leverage type inference: Let TypeScript infer when possible
    5. Create helper types: Build reusable type utilities
    6. Use const assertions: Preserve literal types
    7. Avoid type assertions: Use type guards instead
    8. Document complex types: Add JSDoc comments
    9. Use strict mode: Enable all strict compiler options
    10. Test your types: Use type tests to verify type behavior

    Type Testing

    // Type assertion tests
    type AssertEqual<T, U> = [T] extends [U]
      ? [U] extends [T]
        ? true
        : false
      : false;
    
    type Test1 = AssertEqual<string, string>; // true
    type Test2 = AssertEqual<string, number>; // false
    type Test3 = AssertEqual<string | number, string>; // false
    
    // Expect error helper
    type ExpectError<T extends never> = T;
    
    // Example usage
    type ShouldError = ExpectError<AssertEqual<string, number>>;
    

    Common Pitfalls

    1. Over-using any: Defeats the purpose of TypeScript
    2. Ignoring strict null checks: Can lead to runtime errors
    3. Too complex types: Can slow down compilation
    4. Not using discriminated unions: Misses type narrowing opportunities
    5. Forgetting readonly modifiers: Allows unintended mutations
    6. Circular type references: Can cause compiler errors
    7. Not handling edge cases: Like empty arrays or null values

    Performance Considerations

    • Avoid deeply nested conditional types
    • Use simple types when possible
    • Cache complex type computations
    • Limit recursion depth in recursive types
    • Use build tools to skip type checking in production

    Reproducido de wshobson/agents bajo licencia MIT. Leer esta página en markdown.

    Archivos

    2 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

    Detalles

    Creador
    wshobson
    Licencia
    MIT
    Recursos incluidos
    referencias
    Repositorio
    wshobson/agents
    Código fuente
    Ver SKILL.md

    Etiquetas

    Más de wshobson/agents

    Este repo incluye 180 skills. Si instalas uno, normalmente ya tienes los demás.

    Úsalo al seleccionar y colocar iconos, imágenes, SVGs, diagramas o infografías de apoyo aprobados en un PPTX editable.

    Costo de contexto al activarse
    344 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo cuando pidan optimizar un prompt, mejorar su rendimiento, diseñar una plantilla, aplicar chain-of-thought, few-shot prompting o técnicas avanzadas de prompt engineering para producción.

    Costo de contexto al activarse
    1.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Úsalo al redactar o reparar una especificación JSON con coordenadas explícitas para un PPTX editable.

    Costo de contexto al activarse
    489 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para validar o reparar un PPTX editable en cuanto a geometría, accesibilidad, editabilidad nativa, linaje de fuente e integridad del paquete OOXML.

    Costo de contexto al activarse
    409 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para analizar un PPTX de referencia en modo solo lectura: estructura, tema, tipografía, ritmo de layout, diagnósticos, catálogos de plantillas derivados o inspección segura del paquete OOXML.

    Costo de contexto al activarse
    689 tok
    Tamaño del paquete
    8 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo al preparar la narrativa, las fuentes y el contexto de diseño para un nuevo deck PPTX editable.

    Costo de contexto al activarse
    415 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Skills relacionados

    Patrones de resiliencia en Python: reintentos automáticos, backoff exponencial, timeouts y decoradores tolerantes a fallos para servicios.

    Costo de contexto al activarse
    1.5k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 2 meses
    herramientas desarrollo

    Organización de proyectos Python, arquitectura de módulos y diseño de APIs públicas con __all__, para nuevos proyectos o reorganización de directorios.

    Costo de contexto al activarse
    1.7k tok
    Tamaño del paquete
    1 archivo
    Última actualización
    hace 6 meses
    herramientas desarrollo

    Domina Next.js 14+ App Router con Server Components, streaming, rutas paralelas y data fetching avanzado. Úsalo al construir apps Next.js, implementar SSR/SSG u optimizar React Server Components.

    Costo de contexto al activarse
    929 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 2 meses
    herramientas desarrollo