2017-08-28 50 views
1

我想定義一個函數,它將回調作爲參數,並且應該要求回調的參數。 Typescript正確地報告具有不匹配的參數類型的回調,但沒有提及沒有預期參數的回調。Typescript:必需的回調參數?

爲什麼第二個on調用不是錯誤,並且有什麼辦法可以讓它出錯?

function on(callback: (num: number) => void) { 
    callback(5); 
} 

on((string:bob) => { // typescript error 
    console.log("What"); 
}); 

on(() => { // no typescript error? 
    console.log("What"); 
}); 

回答

1

沒有辦法做到這一點。

回調具有比主叫用戶提供較少的參數是極爲共同在JavaScript - 功能,如forEachmapfilter等所有提供3個或多個參數而被頻繁給出1-參數用作回調。

+1

對,但我認爲Typescript將提供一種方法來定義具有所需參數的回調。類似'function doThing(callback:(num !: number)...')將會很酷,與'?'可選參數標識符相反。 – Jazcash

+3

但是如果你不添加回調參數想要在回調的主體中使用該參數嗎? – Stephan

0

您可以爲處理程序定義一個類型。現在您只能傳遞一個具有字符串參數的回調。

// define a handler so you can use it for callbacks 
type Handler = (t: string) => void; 

function doSomething(t: string): void { 
    console.log("hello " + t) 
} 

function thisFirst(callback: Handler) { 
    callback('world') // ok 
    callback(4) // not assignable to type 'string' 
} 

thisFirst(doSomething) 
+0

這並不能解決OP所要求的問題。用你顯示的代碼可能會有'thisFirst((=)=> console.log(「foo」));'編譯沒有錯誤,OP希望代碼給出一個錯誤,因爲回調函數沒有定義參數 – Louis

+0

好的,我的解決方案不是使用匿名回調,而是定義一個類型和函數名。在我看來,結果是更清晰,更易讀的代碼,但我意識到這只是我的看法:-) – Kokodoko

+0

匿名或不是在這裏的問題不是一個因素。拿你在回答中顯示的代碼,並像這樣定義'doSomething':'function doSomething():void {'。從'doSomething'中刪除對't'的引用。您仍然可以執行'thisFirst(doSomething)'而不會在該調用中發生編譯錯誤。 – Louis