TypeScript 5.4: nuova utility NoInfer

Foto di Randy Fath su Unsplash

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: