Sobes.tech
Middle

Háblame sobre los tipos utilitarios en TypeScript.

sobes.tech AI

Respuesta de la IA

Los tipos utilitarios en TypeScript son tipos incorporados que permiten transformar tipos de datos existentes en nuevos tipos, realizando diversas operaciones útiles. Ayudan a aumentar la flexibilidad y reutilización de tipos, reduciendo la redundancia del código.

Tipos utilitarios principales:

  • Partial<Type>: Crea un nuevo tipo en el que todas las propiedades de Type son opcionales.

    interface User {
      id: number;
      name: string;
      age: number;
    }
    
    type PartialUser = Partial<User>;
    // PartialUser será { id?: number; name?: string; age?: number; }
    
  • Readonly<Type>: Crea un nuevo tipo en el que todas las propiedades de Type son de solo lectura.

    interface Point {
      x: number;
      y: number;
    }
    
    type ReadonlyPoint = Readonly<Point>;
    // ReadonlyPoint será { readonly x: number; readonly y: number; }
    
  • Pick<Type, Keys>: Crea un tipo seleccionando un conjunto específico de propiedades Keys de Type.

    interface Product {
      id: number;
      name: string;
      price: number;
      description: string;
    }
    
    type ProductSummary = Pick<Product, 'id' | 'name' | 'price'>;
    // ProductSummary será { id: number; name: string; price: number; }
    
  • Omit<Type, Keys>: Crea un tipo excluyendo un conjunto específico de propiedades Keys de Type.

    interface Order {
      id: number;
      productId: number;
      quantity: number;
      timestamp: string;
    }
    
    type OrderDetails = Omit<Order, 'timestamp'>;
    // OrderDetails será { id: number; productId: number; quantity: number; }
    
  • Exclude<Type, ExcludedUnion>: Crea un tipo excluyendo de Type aquellos elementos que pueden ser asignados a ExcludedUnion. Se usa para uniones (union types).

    type Colors = 'red' | 'green' | 'blue' | 'yellow';
    type PrimaryColors = Exclude<Colors, 'yellow'>;
    // PrimaryColors será 'red' | 'green' | 'blue'
    
  • Extract<Type, Union>: Crea un tipo seleccionando de Type aquellos elementos que pueden ser asignados a Union. Se usa para uniones.

    type AllAnimals = 'dog' | 'cat' | 'fish' | 'bird';
    type PetAnimals = Extract<AllAnimals, 'dog' | 'cat'>;
    // PetAnimals será 'dog' | 'cat'
    
  • NonNullable<Type>: Crea un tipo excluyendo de Type los valores null y undefined.

    type MaybeString = string | null | undefined;
    type NotNullableString = NonNullable<MaybeString>;
    // NotNullableString será string
    
  • Record<Keys, Type>: Crea un tipo de objeto cuyas propiedades tienen claves de Keys y valores del tipo Type.

    type CityPopulation = Record<string, number>;
    // CityPopulation será { [key: string]: number }
    
    const population: CityPopulation = {
      "Moscow": 12635466,
      "Saint Petersburg": 5381033,
    };
    
  • Parameters<Type>: Devuelve una tupla (tuple) de los tipos de los parámetros de la función Type.

    function greet(name: string, age: number): string {
      return `Hello, ${name}! You are ${age}.`;
    }
    
    type GreetParams = Parameters<typeof greet>;
    // GreetParams será [name: string, age: number]
    
  • ReturnType<Type>: Devuelve el tipo del valor de retorno de la función Type.

    function calculateSum(a: number, b: number): number {
      return a + b;
    }
    
    type SumResult = ReturnType<typeof calculateSum>;
    // SumResult será number
    
  • ConstructorParameters<Type>: Devuelve una tupla o matriz de los tipos de los parámetros del constructor de la clase Type.

    class MyClass {
      constructor(name: string, id: number) {}
    }
    
    type MyClassParams = ConstructorParameters<typeof MyClass>;
    // MyClassParams será [name: string, id: number]
    
  • InstanceType<Type>: Devuelve el tipo de la instancia de la clase Type.

    class AnotherClass {
      value: string;
      constructor(v: string) {
        this.value = v;
      }
    }
    
    type AnotherClassInstance = InstanceType<typeof AnotherClass>;
    // AnotherClassInstance será AnotherClass
    

El uso de tipos utilitarios hace que el código sea más seguro, mantenible y expresivo, permitiendo gestionar eficazmente tipos de datos complejos.