Historie der Frage:
JavaScript erlaubt die Anwendung der Methoden bind, call und apply zur Übertragung des Kontexts (this) und der Argumente. Bis zur Einführung von TypeScript 3.2 wurden diese Methoden weniger streng angesehen: Ihre Argumente erlaubten häufig überflüssige oder fehlerhafte Werte, was zur Ausführung von Fehlern führte. TypeScript implementierte den Parameter strictBindCallApply, der eine strenge Überprüfung der Signaturen dieser Methoden hinzufügt.
Problem:
Ohne strenge Typisierung erlaubten die Methoden bind/call/apply das "Durchschlüpfen" von überflüssigen, fehlenden oder typfremden Argumenten ohne irgendwelche Fehler zur Kompilierungszeit.
Lösung:
Mit der Aktivierung von strictBindCallApply verlangt der TypeScript-Compiler streng, dass:
Beispielcode:
function sum(a: number, b: number): number { return a + b; } const sum2 = sum.bind(null, 1); sum2(2); // OK sum2(2, 3); // Fehler in strictBindCallApply
Schlüsselmerkmale:
Gilt strictBindCallApply nur für Funktionen oder beeinflusst es auch Klassenmethoden?
Es beeinflusst sowohl Funktionen als auch Methoden, da die Methoden bind/call/apply bei jeder Funktion verfügbar sind (Function.prototype). Dies betrifft sowohl unabhängige Funktionen als auch Klassenmethoden.
Kann der Parameter strictBindCallApply ohne strict-Modus strict aktiviert werden?
Nein, um ihn zu aktivieren, ist strict=true oder eine direkte Angabe von strictBindCallApply=true in tsconfig.json erforderlich.
Was passiert, wenn mehr Parameter über bind übergeben werden als in der ursprünglichen Funktion definiert?
Der TypeScript-Compiler mit aktiviertem strictBindCallApply gibt einen Fehler aus: "Erwartete X Argumente, erhielt jedoch Y". Dies schützt vor dem verbreiteten Fehler einer verlängerten Signatur oder dem versehentlichen Erfassen von überflüssigen Variablen.
** Negativer Fall Ein Entwickler verwendet .bind für die partielle Anwendung von Argumenten, macht aber einen Fehler in deren Anzahl. Im normalen Modus gibt es keine Fehler, aber in der Produktion wird die Funktion mit einem überflüssigen Parameter aufgerufen, was die Logik bricht.
Vorteile:
Nachteile:
** Positiver Fall strictBindCallApply ist aktiviert, Funktionen und Methoden verwenden bind streng nach Signatur: überflüssige oder falsche Argumente werden bereits zur Kompilierungszeit herausgefiltert.
Vorteile:
Nachteile: