2017-04-17 112 views
0

打字稿界面我打字稿2.2裏看到了定義的接口調用簽名「超載」功能的選項,我花了相當多的時間來了解如何使用它。有多個呼叫簽名

這樣的工作就可以了,並「破解」後,我認爲這將是值得它張貼在這裏。

我開始了,例如這個問題:

interface Func1 { 
    (num1: number, num2: number): number; 
    (str1: number, str2: string): string; 
} 

function F1(num1: number, num2: number): number { 
    return num1 + num2; 
} 

const f1: Func1 = F1; 
console.log(f1(1, 2)); 

但是編譯器沒有通過它,因爲Func1不能接受F1功能。

我想使超載,我不知道該怎麼辦。

請參閱下面的答案。

回答

2

挖之後,我發現,我們可以做的相當的過載。在TypeScript中重載與其他任何JavaScript代碼沒有區別。它必須在一個函數中執行,而不是在多個函數中執行,如C++。你需要讓你的功能接受所有選項。

例如:

interface Func1 { 
    (v1: number, v2: number): number; 
    (v1: string, v2: string): string; 
} 

const f1: Func1 = (v1, v2): any => { 
    return v1 + v2; 
}; 
console.log(f1("1", "2")); 
console.log(f1(1, 2)); 

假設有類型重載接口調用簽名的所有選項,如果設置強類型它會阻止你,因爲類型的功能f1不澆注料。就像在這個例子中number不可澆注到string

,你還可以創建多個功能,其使用界面調用簽名超載和這些信息傳遞給你的f1如果類型匹配它會通過。只要確保你的功能可以處理所有的接口呼叫簽名。

,重要的是使用的類時或檢查類型實施的功能,如果該函數的參數不是簡單的,像上面的例子,使用typeof和控制所有選項。

希望它有幫助。

+0

'typeof'只對「簡單」類型有意義。如果你這樣做,不要用'instanceof'檢查你正在編寫一個糟糕的API。我可以並且會使用不是'instanceof'類的東西來調用你的API,你將無法阻止它。 –