Tipi di stringhe modello dattiloscritto

Come restringere i tipi di stringa utilizzando il meccanismo delle stringhe modello template

Cosa sono i tipi letterali del modello?

Da Typescript 4.1, puoi migliorare in modo significativo le digitazioni per le tue stringhe. Giusto per ricapitolare rapidamente, in Typescript puoi definire i cosiddetti "Tipi letterali". Invece di definire semplicemente una variabile come stringa, puoi restringere il tipo a un insieme specifico di stringhe consentite.

// Define a mutable string as 'Literal Type'.
let key: "name" | "department" = "name";

// This works, as 'department' is part of the type.
key = "department";
// Won't work, as it's not define in the union type.
key = "company";

// Of course, the same applies for functions.
function getKey(): "name" | "department" {
  return Math.random() <= 0.5 ? "name" : "department";
}

A partire da Typescript 4.1, questo concetto è stato ulteriormente sviluppato. Prendendo "Template Literal Strings" da Javascript come ispirazione, puoi applicare la stessa sintassi per i tuoi tipi letterali in Typescript. La differenza principale è che con "Tipi letterali modello" ottieni molta più flessibilità, poiché il tipo stesso può assumere parametri per questa forma: il concetto è simile ai generici, ma leggermente diverso in quanto richiede valori specifici.

// Define a Literal Type
type State = "ready";

// Nice, isn't it? As in Javascript's 
// 'template literal strings', we can
// reuse the same syntax for TS.
//
// The create type here is now 'Key-ready'.
type Key = `key-${State}`;
// This of course works for union types as well.
// Let's take these non-descriptive types for a 
// quick demo:
type GraphState = "sleep" | "ready" | "error";
type MachineState = "booting" | "running";

// And here's the 'template literal type':
type EntityState = `ES-${GraphState | MachineState}`;

// The possible combinations therefore 
// work out like this:
//
// type EntityState = 'ES-sleep' 
//  | 'ES-ready'
//  | 'ES-error'
//  | 'ES-booting'
//  | 'ES-running'

C'è ancora di più con Typescript 4.3

Mentre scrivo, è stata rilasciata la release candidate per Typescript 4.3, che include ulteriori miglioramenti ai Template Literal Types.

Il sistema dei tipi è ora ancora più dinamico e può dedurre meglio i tipi corretti per te. Queste ultime modifiche maturano ulteriormente il tipo di stringa modello.

// This example is taken 1:1 from 
// Typescript's 4.3 announcement.
// Please check out the link in the
// addendum to see all examples!

declare let s: string;
declare function f<T extends string>(x: T): T;

// Previously: string
// Now       : `hello-${string}`
let x2 = f(`hello ${s}`);

Conclusione

Come hai visto, Typescript è un linguaggio così potente quando si tratta di definire tipi dinamici. Ciò è particolarmente vero per i tipi basati su stringhe. Con le ultime modifiche nella versione 4.3, il sistema di tipi può dedurre meglio che mai i tipi corretti, il che rende il lavoro con Typescript semplicemente un piacere.

Suggerimenti

Correlati

Addendum

Lingue