Introduzione ai tipi mappati TypeScript

I tipi mappati in TypeScript forniscono un modo per creare nuovi tipi trasformando quelli esistenti. Sono uno strumento potente per gestire operazioni di tipo complesse e garantire la sicurezza dei tipi nelle applicazioni TypeScript. Questo articolo introduce i tipi mappati, spiega la loro sintassi e fornisce esempi per dimostrarne l'uso.

Cosa sono i tipi mappati?

I tipi mappati consentono la creazione di nuovi tipi applicando una trasformazione a ogni proprietà di un tipo esistente. Sono spesso utilizzati per modificare o estendere i tipi in modo flessibile. La sintassi di base di un tipo mappato è:

type MappedType = {
  [K in keyof T]: NewType;
};

In questa sintassi:

  • T è il tipo originale.
  • K rappresenta ciascuna tonalità in T.
  • NewType è il nuovo tipo assegnato a ciascuna proprietà.

Esempio di base di tipi mappati

Ecco un semplice esempio di un tipo mappato che converte tutte le proprietà di un dato tipo in sola lettura:

type ReadOnly = {
  readonly [K in keyof T]: T[K];
};

type User = {
  name: string;
  age: number;
};

type ReadOnlyUser = ReadOnly;

In questo esempio, il tipo mappato ReadOnly trasforma tutte le proprietà del tipo User in di sola lettura, creando un nuovo tipo ReadOnlyUser in cui tutte le proprietà sono immutabili.

Tipi mappati con trasformazioni di tipo

I tipi mappati possono anche essere usati per trasformare i tipi in modi più complessi. Ad esempio, un tipo mappato che rende tutte le proprietà opzionali:

type Partial = {
  [K in keyof T]?: T[K];
};

type User = {
  name: string;
  age: number;
};

type PartialUser = Partial;

In questo esempio, il tipo mappato Partial rende facoltative tutte le proprietà del tipo User, creando un nuovo tipo PartialUser in cui ogni proprietà è facoltativa.

Utilizzo di tipi mappati con tipi condizionali

I tipi mappati possono essere combinati con tipi condizionali per operazioni di tipo più sofisticate. Ad esempio, creando un tipo che include solo proprietà di un certo tipo:

type OnlyStrings = {
  [K in keyof T]: T[K] extends string ? T[K] : never;
};

type User = {
  name: string;
  age: number;
  email: string;
};

type StringProperties = OnlyStrings;

In questo esempio, il tipo mappato OnlyStrings filtra le proprietà che non sono di tipo string, generando un nuovo tipo StringProperties che include solo le proprietà stringa del tipo User.

Tipi mappati avanzati

I casi d'uso avanzati per i tipi mappati includono la creazione di tipi che modificano i tipi esistenti in base a varie condizioni. Ad esempio, un tipo mappato che aggiunge un suffisso a ciascun nome di proprietà:

type WithSuffix<T, S extends string> = {
  [K in keyof T as `${string & K}${S}`]: T[K];
};

type User = {
  name: string;
  age: number;
};

type UserWithSuffix = WithSuffix<User, "Prop">;

In questo esempio, il tipo mappato WithSuffix aggiunge un suffisso a ciascun nome di proprietà del tipo User, generando un nuovo tipo UserWithSuffix in cui i nomi di proprietà hanno il suffisso specificato.

Conclusione

I tipi mappati in TypeScript sono una funzionalità versatile che consente agli sviluppatori di creare nuovi tipi trasformando quelli esistenti. Comprendendo e utilizzando i tipi mappati, gli sviluppatori possono gestire complesse trasformazioni di tipi e garantire una maggiore sicurezza dei tipi nel loro codice TypeScript. I tipi mappati offrono potenti capacità per migliorare e personalizzare le definizioni di tipo nelle applicazioni TypeScript.