2016-06-19 7 views

Antwort

11

In Imperativsprachen kann void als ein Typ mit einem einzelnen Wert betrachtet werden. Solche Sprachen bieten keine Möglichkeit, diesen Wert zu konstruieren oder zu konsumieren, aber eine void-Funktion kann als Rückgabe dieses trivialen Werts angesehen werden.

Im Gegensatz dazu ist never ein Typ, der keine Werte enthält, was bedeutet, dass eine Funktion mit diesem Rückgabetyp niemals normal zurückkehren kann. Dies bedeutet, entweder eine Ausnahme auszulösen oder nicht zu beenden.

15

Lees sehr gute Antwort, eine andere Art und Weise zu denken es zu ergänzen ist, dass in einem richtig typisierte Programm, ein never Wert nicht beobachtet werden kann.

Neben Funktionen, die nie zurückkehren (oder was immer Ausnahmen werfen), werden Sie die never Art sehen, wenn eine Vereinigung Art von allen möglichen Bestandteilen ausgeschöpft ist:

// 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

Auch für mehr a theorical Grund, mit --strictNullChecks neue Flag, TypeScript benötigt einen neuen Bottom-Typ (seit null und undefined sind nicht mehr). Der Typ never ist ein solcher Bottom-Typ und macht das TypeScript-Typsystem konsistenter.

2

Der Rückgabetyp von Promise.reject() ist Promise<never>, was "es wird nie aufgelöst" bedeutet.

Also, wenn eine Funktion Promise<never> zurückgibt, denke ich, dass es nur Fehler zurückgibt. Auf der anderen Seite kann Promise<void> ohne Wert aufgelöst werden.

+0

Scheint wie dies nicht der Fall ist. Siehe http://stackoverflow.com/questions/41291341/typescript-generics-void-never-oder-undefined – unional

Verwandte Themen