Els tipus mapats (Mapped Types) són una característica avançada de TypeScript que permet crear nous tipus basats en la transformació d'altres tipus. Aquesta funcionalitat és especialment útil per a la creació de tipus derivats de manera dinàmica, mantenint la consistència i la seguretat de tipus.

Conceptes Clau

  1. Tipus Mapats Bàsics: Permeten transformar les propietats d'un tipus existent.
  2. Modificadors de Propietats: Poden afegir o eliminar modificadors com readonly o ? (opcional).
  3. Tipus Predefinits: TypeScript proporciona alguns tipus mapats predefinits com Partial, Readonly, Pick, i Record.

Tipus Mapats Bàsics

Els tipus mapats es defineixen utilitzant la sintaxi de tipus indexats, on es recorre cada propietat d'un tipus existent i es transforma segons sigui necessari.

Exemple Bàsic

type Person = {
  name: string;
  age: number;
  address: string;
};

type ReadonlyPerson = {
  readonly [K in keyof Person]: Person[K];
};

En aquest exemple, ReadonlyPerson és un tipus mapat que fa que totes les propietats de Person siguin de només lectura (readonly).

Explicació del Codi

  • keyof Person: Obté una unió de les claus del tipus Person ("name" | "age" | "address").
  • [K in keyof Person]: Itera sobre cada clau de Person.
  • Person[K]: Obté el tipus de la propietat corresponent en Person.

Modificadors de Propietats

Els tipus mapats poden utilitzar modificadors per canviar les propietats de les claus.

Exemple amb Modificadors

type OptionalPerson = {
  [K in keyof Person]?: Person[K];
};

type ReadonlyOptionalPerson = {
  readonly [K in keyof Person]?: Person[K];
};
  • ?: Fa que les propietats siguin opcionals.
  • readonly: Fa que les propietats siguin de només lectura.

Tipus Predefinits

TypeScript proporciona alguns tipus mapats predefinits que són molt útils.

Partial

Fa que totes les propietats d'un tipus siguin opcionals.

type PartialPerson = Partial<Person>;

Readonly

Fa que totes les propietats d'un tipus siguin de només lectura.

type ReadonlyPerson = Readonly<Person>;

Pick

Selecciona un subconjunt de propietats d'un tipus.

type NameAndAge = Pick<Person, "name" | "age">;

Record

Crea un tipus amb un conjunt de claus i un tipus de valor comú.

type StringDictionary = Record<string, string>;

Exercicis Pràctics

Exercici 1

Crea un tipus mapat que faci que totes les propietats d'un tipus siguin opcionals i de només lectura.

type Person = {
  name: string;
  age: number;
  address: string;
};

type ReadonlyOptional<T> = {
  readonly [K in keyof T]?: T[K];
};

type ReadonlyOptionalPerson = ReadonlyOptional<Person>;

Exercici 2

Utilitza el tipus Pick per crear un nou tipus que només contingui les propietats name i address de Person.

type NameAndAddress = Pick<Person, "name" | "address">;

Solucions

Solució Exercici 1

type Person = {
  name: string;
  age: number;
  address: string;
};

type ReadonlyOptional<T> = {
  readonly [K in keyof T]?: T[K];
};

type ReadonlyOptionalPerson = ReadonlyOptional<Person>;

// Exemple d'ús
const person: ReadonlyOptionalPerson = {
  name: "John",
  // age i address són opcionals i de només lectura
};

Solució Exercici 2

type NameAndAddress = Pick<Person, "name" | "address">;

// Exemple d'ús
const person: NameAndAddress = {
  name: "John",
  address: "123 Main St",
  // age no està permès
};

Conclusió

Els tipus mapats són una eina poderosa en TypeScript per crear tipus derivats de manera dinàmica i segura. Amb ells, pots transformar i modificar tipus existents per adaptar-los a les necessitats específiques del teu projecte, mantenint la seguretat de tipus i la consistència del codi.

© Copyright 2024. Tots els drets reservats