2017-06-22 62 views
0

我有一個更高級的函數,用一個在線檢查來封裝一個函數,我正在嘗試寫一個類型簽名,但我無法弄清楚。這是我到目前爲止有:如何鍵入一個函數將任何函數作爲參數?

const preventOffline = <T extends Function>(fn: T): T => 
    function() { // Error: Type '() => any' is not assignable to type 'T'. 
    if (!window.navigator.onLine) { 
     alert("Sorry, please retry when you're online."); 
     return undefined; 
    } 
    return fn.apply(this, arguments); 
    }; 

我也試過這樣,由於某種原因給了我一個錯誤說T聲明,但從未使用過。

export const preventOfflineHOF = <T, U>(fn: (T) => U): ((T) => U | undefined) => 

我該如何對此進行正確的註釋?

回答

1

簽名表示應該返回傳入的相同類型的函數,但編譯器無法斷言情況如此。

如果你有一個特定的函數簽名,你是期待,那麼你可以這樣做,例如:

const preventOffline = (fn: (p1: string, p2: number) => boolean): (p1: string, p2: number) => boolean => 
    function (p1: string, p2: number) { 
     return false; 
} 

,編譯器不會抱怨。
但是,因爲你要允許所有的功能,你只需要告訴你知道你通過鑄造在做什麼any編譯:

const preventOffline = <T extends Function>(fn: T): T => 
    function() { 
     if (!window.navigator.onLine) { 
      alert("Sorry, please retry when you're online."); 
      return undefined; 
     } 
     return fn.apply(this, arguments); 
} as any; 

另一種選擇是,除去仿製藥和接受只是一個Function

const preventOffline = (fn: Function): Function => 
    ... 
}; 

但隨後就失去了傳遞的類型,功能和preventOffline將只是一個Function

-2
const preventOffline = <T extends Function>(fn:() => T): T => 
    function() { 
    if (!window.navigator.onLine) { 
     alert("Sorry, please retry when you're online."); 
     return undefined; 
    } 
    return fn.apply(this, arguments); 
}; 
+0

我可能知道爲什麼我的答案被降低了嗎? – rainerhahnekamp

+1

可能是因爲類型簽名與功能不匹配。 'T'不是傳入的函數的返回值,而是傳入的函數的類型。 – ahstro

+0

另外,好像你的代碼產生了相同的確切錯誤:「Type'()=> any'不能分配給類型'T'」。你在發佈它作爲答案之前是否還檢查過你的代碼? –

相關問題