考慮下面的打字稿代碼:爲什麼無效函數在Typescript的左邊部分中是允許的?
var action = function action(): void {
//do things
};
var res = action();
爲什麼它是罰款TS編譯器?
考慮下面的打字稿代碼:爲什麼無效函數在Typescript的左邊部分中是允許的?
var action = function action(): void {
//do things
};
var res = action();
爲什麼它是罰款TS編譯器?
爲什麼在Typescript的左邊部分中允許void函數?
只是因爲他們不被禁止。請注意,沒有必要使用void變量來做有用的(壞)事情,例如,
var action = function action(): void {};
var res = action();
res.foo; // Error
最有可能是因爲,void
是在打字稿一種類型,它有它的設置可能的值,其是undefined
和null
的,因此可以在指配的左側部分被使用。
我發現它允許在作業中使用鍵入爲void
的值可能會導致嚴重錯誤。例如,如果有一個函數返回一個有意義的被重構以返回void
,那麼在編譯時就不會出現錯誤。
對於參考打字稿1.4語言規範有以下說一下void類型:
void類型[...]表示的值的情況下 並用作函數的返回類型沒有返回 的值。 Void類型的唯一可能值爲空,並且未定義爲 。 Void類型是Any類型的子類型,以及Null類型和Undefined類型的超類型 ,但其他情況下Void與所有其他類型無關。
注意:我們可能會考慮禁止聲明 類型爲Void的變量,因爲它們沒有任何用處。但是, 因爲Void允許作爲泛型類型或 函數的類型參數,所以禁止使用Void屬性或參數是不可行的。
考慮以下代碼:
// 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);
如果我們考慮一下泛型函數作爲模板的特定類型的實例(注:他們不是),result
是void
類型的時候被調用time
與doSomething
。顯然這個世界在發生這種情況時不會發生爆炸,所以有一個類型爲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
的任何屬性,那麼很可能我們沒有做錯任何事情,也不應該被打擾。
它並沒有真正回答我的問題,我不同意它的無害。 –