2015-06-10 38 views

回答

1

爲什麼在Typescript的左邊部分中允許void函數?

只是因爲他們不被禁止。請注意,沒有必要使用void變量來做有用的(壞)事情,例如,

var action = function action(): void {}; 
var res = action(); 
res.foo; // Error 
+1

它並沒有真正回答我的問題,我不同意它的無害。 –

1

最有可能是因爲,void是在打字稿一種類型,它有它的設置可能的值,其是undefinednull的,因此可以在指配的左側部分被使用。

我發現它允許在作業中使用鍵入爲void的值可能會導致嚴重錯誤。例如,如果有一個函數返回一個有意義的被重構以返回void,那麼在編譯時就不會出現錯誤。

對於參考打字稿1.4語言規範有以下說一下void類型:

void類型[...]表示的值的情況下 並用作函數的返回類型沒有返回 的值。 Void類型的唯一可能值爲空,並且未定義爲 。 Void類型是Any類型的子類型,以及Null類型和Undefined類型的超類型 ,但其他情況下Void與所有其他類型無關。
注意:我們可能會考慮禁止聲明 類型爲Void的變量,因爲它們沒有任何用處。但是, 因爲Void允許作爲泛型類型或 函數的類型參數,所以禁止使用Void屬性或參數是不可行的。

0

考慮以下代碼:

// Generic function for perf measuring 
function time<T>(f:() => T): T { 
    var start = Date.now(); 
    var result = f(); 
    console.log('It took ' + (Date.now() - start) + ' to run'); 
    return f; 
} 

function doSomething(): void { } 

time(doSomething); 

如果我們考慮一下泛型函數作爲模板的特定類型的實例(注:他們不是),resultvoid類型的時候被調用timedoSomething。顯然這個世界在發生這種情況時不會發生爆炸,所以有一個類型爲void的變量並不是必須被阻止的東西。

再舉一例:

declare function doNothing(): void; 
declare function doOneThing(): void; 
declare function doManyThings(): void; 

function doSomething(x: number) { 
    switch (x) { 
     case 0: 
      return doNothing(); 
     case 1: 
      return doOneThing(); 
     default: 
      return doManyThings(); 
    } 
} 

在這裏,我們希望把它這樣,如果我們改變doSomething返回類型,我們必須更新的doNothing/doOneThing/doManyThings返回類型。再一次,這裏的一般原則是:void正在移動而沒有不良影響。這個例子是而不是人爲 - 它是從TypeScript編譯器本身的一些代碼改編而來的。

讓我們重構代碼位:

function doSomething(x: number) { 
    if (x > 1) { 
     return doManyThings(); 
    } else { 
     // result: void! 
     var result = x === 0 ? doNothing() : doOneThing(); 
     return result; 
    } 
} 

爲什麼要這樣無害的重構引入誤差?重點是什麼?如果我們嘗試訪問result的任何屬性,那將是一個錯誤。如果我們不嘗試訪問result的任何屬性,那麼很可能我們沒有做錯任何事情,也不應該被打擾。

相關問題