2016-06-19 74 views

回答

11

在命令式語言中,void可以被認爲是包含單個值的類型。這些語言不提供構建或使用此值的方法,但void函數可以被認爲是返回這個微不足道的值。

與此相反never是一個不包含值的類型,這意味着具有此返回類型的函數根本無法正常返回。這意味着要麼拋出異常,要麼終止。

15

爲了增加李的非常好的答案,另一種想法是,在正確類型的程序中,可以觀察到never不可以

除了永不返回(或總是拋出異常)的功能,你會看到當一個聯合類型已經用盡了所有可能成分的never類型:

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

此外,對於更多一個理論原因,與--strictNullChecks新標誌,TypeScript需要一個新的底部類型(因爲nullundefined不再)。類型never是這樣一個底部類型,並使TypeScript的類型系統更加一致。

2

返回類型Promise.reject()Promise<never>,意思是「它永遠不會被解決」。

所以如果函數返回Promise<never>,我認爲它只會返回錯誤。另一方面,Promise<void>可能無價值地解決。

+0

似乎並非如此。請參閱http://stackoverflow.com/questions/41291341/typescript-generics-void-never-or-undefined – unional

相關問題