ProgrammazioneSviluppatore Fullstack

Spiega la differenza tra il tipo never e void in TypeScript. Quando e perché dovresti usare ciascuno di essi?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

void e never in TypeScript sono tipi diversi:

  • void è generalmente usato come tipo di ritorno per funzioni che non restituiscono nulla, cioè la funzione termina l'esecuzione ma non restituisce un valore.
  • never significa che una funzione (o espressione) non terminerà mai con successo: o solleva sempre un'eccezione oppure non restituisce mai il controllo (ad esempio, un ciclo infinito).

Esempi:

function log(message: string): void { console.log(message); } function throwError(message: string): never { throw new Error(message); } function infinite(): never { while (true) {} }

never è spesso utilizzato per controllare la completezza dello switch-case per i tipi:

type Shape = { kind: 'circle' } | { kind: 'square' }; function getArea(shape: Shape) { switch (shape.kind) { case 'circle': return 1; case 'square': return 2; default: const _exhaustive: never = shape; // Qui il compilatore avviserà se un caso è stato saltato } }

Domanda trabocchetto.

Possono void e never essere usati in modo intercambiabile come tipi di ritorno delle funzioni?

Risposta: No. Una funzione con tipo void restituisce undefined o non restituisce nulla, ma termina l'esecuzione. Una funzione con tipo never non termina mai l'esecuzione con successo (solleva un errore o entra in un ciclo infinito).

Esempio:

const fn: () => never = () => { // return; // Errore: Una funzione il cui tipo dichiarato è 'never' non deve restituire. };

Storia

Nel sistema analitico, la funzione di validazione è stata tipizzata con tipo di ritorno void, anche se sollevava sempre un'eccezione. Di conseguenza, gli sviluppatori pensavano che la funzione potesse "tornare" e non effettuavano ulteriori controlli, il che ha portato a non gestire gli errori e a implementare in modo errato la catena di chiamate.


Storia

In uno dei progetti, la funzione TypeScript, che si aspettava un tipo di ritorno chiaramente tipizzato, è stata definita come restitutiva never, anziché void. Questo ha causato errori di compilazione e perdita di compatibilità API quando si cercava di chiamare la funzione con un callback che era tipizzato come never.


Storia

Nel modulo backend, in passato si sollevava un'eccezione tramite una funzione con tipo di ritorno void. Dopo la migrazione a TypeScript, il compilatore non avvisava dell'uscita dal codice dopo la chiamata a questa funzione, portando a righe aggiuntive di codice "inaccessible" — e solo cambiando il tipo di ritorno in never è stato possibile rilevare tali punti e rendere il codice più pulito, evitando errori logici.