2016-06-19 7 views

risposta

11

In lingue imperative, void può essere considerato come un tipo contenente un singolo valore. Tali linguaggi non forniscono un mezzo per costruire o consumare questo valore, ma una funzione void può essere considerata come la restituzione di questo valore insignificante.

Al contrario, never è un tipo che non contiene valori, il che significa che una funzione con questo tipo di ritorno non può mai tornare normalmente. Ciò significa lanciare un'eccezione o non riuscire a terminare.

15

per aumentare molto buona la risposta di Lee, un altro modo di pensare è che in un programma correttamente tipizzato, un valore di nevernon può essere osservato.

Oltre alle funzioni che non tornano più (o che gettano sempre delle eccezioni), si vedrà il tipo never quando un tipo di unione è stato esaurito di tutte le sue possibili costituenti:

// Example assumes --strictNullChecks 
function fn(x: number | string) { 
    if (typeof x === 'number') { 
    // x: number in this block 
    } else if (typeof x === 'string') { 
    // x: string in this block 
    } else { 
    // x: never in this block 
    // this block does not run; the value of x cannot be observed 
    } 
} 
3

Inoltre, per più a teorico motivo, con --strictNullChecks nuovo flag, TypeScript aveva bisogno di un nuovo tipo di fondo (dal null e dal undefined non c'è più). Il tipo never è un tipo di fondo inferiore e rende il sistema di tipo TypeScript più coerente.

2

Il tipo di reso di Promise.reject() è Promise<never>, che significa "non viene mai risolto".

Quindi, se una funzione restituisce Promise<never>, penso che restituirà solo errori. D'altra parte, Promise<void> potrebbe essere risolto senza valore.

+0

Sembra che questo non sia il caso. Vedi http://stackoverflow.com/questions/41291341/typescript-generics-void-never-or-undefined – unional