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.