Historia pytania:
JavaScript pozwala stosować metody bind, call i apply do przekazywania kontekstu (this) i argumentów. Przed wprowadzeniem TypeScript 3.2 metody te były traktowane mniej restrykcyjnie: w ich argumentach często dopuszczano zbędne lub niepoprawne wartości, co prowadziło do błędów w czasie wykonania. TypeScript wprowadził parametr strictBindCallApply, który dodaje ścisłą kontrolę sygnatur tych metod.
Problem:
Bez ścisłej typizacji metody bind/call/apply pozwalały na "przechodzenie" zbędnych, brakujących lub niezgodnych typowo argumentów bez żadnych błędów w czasie kompilacji.
Rozwiązanie:
Po włączeniu strictBindCallApply kompilator TypeScript wymaga ścisłego przestrzegania, aby:
Przykład kodu:
function sum(a: number, b: number): number { return a + b; } const sum2 = sum.bind(null, 1); sum2(2); // OK sum2(2, 3); // Błąd w strictBindCallApply
Kluczowe cechy:
Czy strictBindCallApply działa tylko dla funkcji, czy ma również wpływ na metody klasy?
Ma wpływ zarówno na funkcje, jak i na metody, ponieważ metody bind/call/apply są dostępne na każdej funkcji (Function.prototype). Dotyczy to zarówno funkcji niezależnych, jak i metod klas.
Czy parametr strictBindCallApply może być włączony bez trybu ścisłego strict?
Nie, jego aktywacja wymaga strict=true lub bezpośredniego wskazania strictBindCallApply=true w tsconfig.json.
Co się stanie, jeśli za pomocą bind przekażę więcej parametrów niż zdefiniowano w funkcji źródłowej?
Kompilator TypeScript przy włączonym strictBindCallApply zgłosi błąd: "Oczekiwano X argumentów, ale otrzymano Y". To chroni przed powszechnym błędem przedłużonej sygnatury lub przypadkowego przechwytywania zbędnych zmiennych.
** Negatywny przypadek Programista używa .bind do częściowego zastosowania argumentów, ale pomylił się w ich liczbie. W normalnym trybie nie ma błędów, ale w produkcji funkcja jest wywoływana z dodatkowym parametrem i łamie logikę.
Zalety:
Wady:
** Pozytywny przypadek Włączony strictBindCallApply, funkcje i metody korzystają z bind ściśle według sygnatury: zbędne lub niepoprawne argumenty są filtrowane na etapie kompilacji.
Zalety:
Wady: