2017-06-22 2 views
0

Ich habe eine Funktion höherer Ordnung, die eine Funktion mit einer Online-Prüfung umschließt, für die ich versuche, eine Typ-Signatur zu schreiben, aber ich kann es nicht herausfinden. Dies ist, was ich bisher habe:Wie kann ich eingeben, dass eine Funktion eine Funktion als Argument übernimmt?

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); 
    }; 

Ich habe auch versucht, das, was aus irgendeinem Grund gibt mir eine Fehlermeldung, T deklariert, aber nie verwendet.

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

Wie kann ich dies richtig annotieren?

Antwort

1

Die Signatur sagt, dass die gleiche Art von Funktion, die übergeben wurde zurückgeschickt werden soll, aber der Compiler hat keine Möglichkeit, zu behaupten, dass dies der Fall ist.

Wenn Sie eine bestimmte Funktion Signatur haben würde, die Sie erwartet haben, dann können Sie dies zum Beispiel getan haben:

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

Und der Compiler nicht beklagen.
Aber weil Sie alle Funktionen zulassen möchten, müssen Sie nur den Compiler sagen, dass Sie wissen, was Sie durch Gießen zu any tun:

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; 

Eine weitere Möglichkeit ist es, die Generika zu entfernen und akzeptieren nur eine Function:

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

Aber dann verlieren Sie den Typ der in Funktion übergeben und preventOffline wird nur ein Function sein.

-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

Könnte ich wissen, warum meine Antwort abgelehnt wurde? – rainerhahnekamp

+1

Wahrscheinlich, weil die Typ-Signatur nicht mit dem übereinstimmt, was die Funktion tut. 'T' ist nicht der Rückgabewert der übergebenen Funktion, sondern der Typ der übergebenen Funktion. – ahstro

+0

Außerdem scheint Ihr Code genau den gleichen Fehler zu erzeugen:" Type '() => any' ist dem Typ nicht zuweisbar 'T' ". Haben Sie Ihren Code überprüft, bevor Sie ihn als Antwort gepostet haben? –

Verwandte Themen