TypeScript 5.4: nuova utility NoInfer
L’uscita di TypeScript 5.4 porta con se varie novità, tra le quali una nuova utility NoInfer<T>
.
Perché è stata introdotta l’utility NoInfer
?
La necessità nasce dal fatto che spesso non è possibile in modo corretto dedurre quali valori può assumere un determinato attributo. Ad esempio, se noi scriviamo una funzione che accetta:
- un elenco di animali possibili;
- un’animale di default;
function visualizzaAnimale<A extends string>(animali: A[], animaleDefault?: A) {
// ...
}
visualizzaAnimale(["cane", "gatto", "tartaruga"], "cane");
è molto probabile che ci aspettiamo animaleDefault
impostato su uno di quelli possibili.
Al momento, con la definizione di tipi di cui sopra, questo non è sempre garantito. Infatti rimane valida, anche se non desiderabile, un’invocazione di questo tipo:
visualizzaAnimale(["cane", "gatto", "tartaruga"], "coccodrillo");
La soluzione
Per questo è stata introdotta l’utility NoInfer
che ci permette di istruire TypeScript a non analizzare e a non tenere in considerazione il valore che passiamo a animaleDefault
come valido per il generic A
.
function visualizzaAnimale<A extends string>(animali: A[], animaleDefault?: NoInfer<A>) {
// ...
}
visualizzaAnimale(["cane", "gatto", "tartaruga"], "coccodrillo");
// ~~~~~~
// error!
// Argument of type '"coccodrillo"' is not assignable to parameter of type '"cane", "gatto", "tartaruga" | undefined'.
Così diciamo a TypeScript di ignorare i valori che può avere animaleDefault
e considerare possibili solo quelli di animali
.
Se cercate maggiori informazioni: