2014-01-14 96 views
8

可以將void指定爲TypeScript中泛型函數的類型參數。並且它對函數的返回值正常工作。但是,void是一種參數,但它不清楚可以使用哪種值。有沒有辦法爲void類型的參數指定參數?如果否,爲什麼可以聲明這樣的函數?void作爲TypeScript中泛型函數的參數的類型

回答

0

原來,它很容易得到無效的價值。雖然技術上它仍然是undefined值,但打字稿認爲它是void類型,這正是我們所需要的:

var voidValue = (function() { })(); 
7

TypeScript specification

注意:我們可能會考慮禁止void類型聲明變量,因爲他們還是沒有的。但是,由於Void允許作爲泛型類型或函數的類型參數,因此禁止使用Void屬性或參數是不可行的。

4

可以使用void作爲類型參數,但不應將其用作類型。

事實上,儘管你可以在目前類型註釋使用它,這是不可能指定一個值:

var x: void = ???; // cannot supply a value 

下面被示出爲一種類型的自變量使用的空隙的:

class Example<TReturn> { 
    process(func:() => TReturn) { 
     return func(); 
    } 
} 

此類中的type參數用於指定函數的返回類型。這意味着我可能希望指定該函數將具有void類型。所以它必須被允許作爲類型參數。

var example = new Example<void>(); 

現在,當我寫調用example.process,自動完成會告訴我,我傳給需要的參數滿足以下類型:

func:() => void 

而且它還會告訴我,example.process本身在這種情況下是無效的

意圖不是void永遠用於註釋一個類型,但是因爲有正當的理由允許它作爲類型參數它當前不被檢查。這意味着你可以創造一些無效的,但你會很難使用它:

class Example<T> { 
    process(func: T) { 
     // if T is void, this is all wrong 
    } 
} 

var example = new Example<void>(); 

在這個例子無效(不顯示任何錯誤),您將無法將呼叫寫入example.process,因爲你無法傳遞有效的參數。

+1

對此我很抱歉。你能向我強調你的問題的一部分,我還沒有回答? – Fenton

0

你可以做這樣的事情:

class Example<T> { 
    process(func: T = undefined) { 
    // use default undefined parameter 
    } 
} 

var example = new Example<void>(); 

exmple.process(); 

我使用打字稿1.8.7,它對我很好。