TypeScript Academy · Lezione

Il tipo never e gli stati impossibili

Modelli codice irraggiungibile e valori impossibili con never.

Lezione 2 di 413 passaggi

Il tipo never e gli stati impossibili è una lezione TypeScript Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento TypeScript Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso TypeScript Academy include 4 lezioni in totale.

Il tipo never

never è il tipo vuoto: rappresenta valori che non possono mai verificarsi. Nessun valore è assegnabile a never, ad eccezione di never stesso. Indica situazioni che dovrebbero essere impossibili.

// You cannot create a value of type never
function crash(): never {
  throw new Error('boom');
}
try { crash(); } catch (e) { console.log('caught'); }

Funzioni che non restituiscono mai

Una funzione che esegue sempre throw non restituisce mai normalmente un valore, quindi il suo tipo restituito è never. Questo indica ai chiamanti e al compilatore che l'esecuzione si interrompe in quel punto.

function fail(message: string): never {
  throw new Error(message);
}
try { fail('invalid'); } catch (e) { console.log('handled'); }

I cicli infiniti restituiscono never

Anche una funzione con un ciclo infinito non restituisce mai un valore, quindi viene tipizzata come never. Il compilatore riconosce che il flusso di controllo non può proseguire oltre quel punto.

function listen(): never {
  while (true) {
    // forever
    break; // (break added so the demo terminates)
  }
  throw new Error('stopped');
}
console.log('listen has return type never');

never e void

Non confonda never con void. Una funzione void restituisce un valore, anche se non produce alcun risultato utile. Una funzione never non restituisce affatto un valore: genera un errore o entra in un ciclo infinito.

function logIt(): void {
  console.log('done'); // returns normally
}
function abort(): never {
  throw new Error('stop'); // never returns
}
logIt();
try { abort(); } catch (e) { console.log('ok'); }

never nei controlli di esaustività

L'uso più pratico di never è il controllo di esaustività. Nel ramo default di uno switch, assegni la variabile a un never. Se tutti i casi sono gestiti, la variabile è già never e il codice viene compilato.

type Shape = 'circle' | 'square';

function area(s: Shape): string {
  switch (s) {
    case 'circle': return 'pi r^2';
    case 'square': return 'a^2';
    default:
      const _check: never = s; // ok: all handled
      return _check;
  }
}
console.log(area('square'));

Rilevare i casi mancanti

Se qualcuno aggiunge un nuovo membro all'unione ma dimentica un caso, il valore rimanente non è più never, quindi l'assegnazione non viene compilata. Il controllo con never trasforma una lacuna silenziosa in un errore evidente.

type Shape = 'circle' | 'square' | 'triangle';
// If 'triangle' case is missing, assigning s to never
// would error: 'triangle' is not assignable to never.
console.log('Add a case for every member');

never nei rami impossibili delle unioni

Quando il restringimento elimina ogni possibilità, il tipo rimanente è never. Il compilatore sa che quel ramo è irraggiungibile, cosa che può rivelare errori logici.

function check(x: string | number): void {
  if (typeof x === 'string') {
    console.log('string');
  } else if (typeof x === 'number') {
    console.log('number');
  } else {
    // x is never here
    console.log('unreachable');
  }
}
check('hi');

never come tipo bottom

never è il tipo bottom: è assegnabile a ogni altro tipo, perché un valore che non può esistere è compatibile per definizione con qualsiasi cosa. Per questo un throw può comparire in qualsiasi posizione espressiva.

function getOrThrow(v: string | null): string {
  return v ?? fail();
}
function fail(): never {
  throw new Error('missing');
}
console.log(getOrThrow('value'));

Filtrare le unioni con never

Nei tipi condizionali e mappati, never equivale a «rimuovi questo». L'unione con never non cambia nulla: T | never è semplicemente T. Per questo è la scelta naturale per i filtri.

type Keep<T> = T extends string ? T : never;
type R = Keep<'a' | 1 | 'b'>; // 'a' | 'b'
const x: R = 'a';
console.log(x);

Modellare stati impossibili

Usi never nelle strutture degli oggetti per rendere impossibili da rappresentare le combinazioni illegali. Qui uno stato «loading» non può contenere anche dati, perché il tipo lo vieta.

type State =
  | { status: 'loading'; data?: never }
  | { status: 'ready'; data: number };

const s: State = { status: 'ready', data: 7 };
console.log(s);

never migliora la sicurezza del refactoring

Poiché i controlli di esaustività con never falliscono quando manca un caso, rendono più sicuro il refactoring: estenda un'unione e il compilatore indicherà ogni punto da aggiornare.

type Cmd = 'start' | 'stop';
function run(c: Cmd): string {
  if (c === 'start') return 'starting';
  if (c === 'stop') return 'stopping';
  const _x: never = c;
  return _x;
}
console.log(run('start'));

Verifica rapida

Verifichi la Sua comprensione del tipo never.

Riepilogo: never

Ha imparato che never:

  • È il tipo vuoto: nessun valore può essere di tipo never.
  • È il tipo di ritorno delle funzioni che lanciano eccezioni o eseguono un ciclo infinito.
  • Rende possibili i controlli di esaustività nei default degli switch.
  • Compare nei rami impossibili del restringimento del tipo e filtra le unioni nella logica dei tipi.

Ora esaminiamo void e le sue differenze.

function assertNever(x: never): never {
  throw new Error('Unexpected: ' + String(x));
}
console.log('assertNever guards exhaustiveness');
Gratis per iniziare

Impara TypeScript con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
101
Lezioni
352

Domande Frequenti

La lezione «Il tipo never e gli stati impossibili» è gratuita?

Sì — il testo completo di «Il tipo never e gli stati impossibili» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso TypeScript Academy, passa a CoddyKit PRO. Il corso TypeScript Academy include 4 lezioni in totale.

Cosa imparerò in «Il tipo never e gli stati impossibili»?

Modelli codice irraggiungibile e valori impossibili con never. Eserciti TypeScript Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare TypeScript Academy?

Non è richiesta alcuna esperienza precedente. TypeScript Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Il tipo never e gli stati impossibili»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione TypeScript Academy?

Sì. Ogni lezione TypeScript Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Capire unknown e any
  2. Il tipo never e gli stati impossibili
  3. Il tipo void nelle funzioni
  4. Gestire unknown in modo type-safe
← Torna a TypeScript Academy