programowanieProgramista Fullstack / Programista Frontend

Jak działa typizacja funkcji zwrotnej (callback) w TypeScript i co należy uwzględnić przy typizacji parametrów i wartości zwracanych przez callbacki?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

W TypeScript zaleca się wyraźne definiowanie typów dla funkcji zwrotnych. Określenie typów parametrów i wartości zwracanych pomaga zapobiegać błędom:

type Callback = (event: string, id: number) => boolean; function useCallback(cb: Callback) { // ... }
  • Wszystkie parametry i wartość zwracana powinny być wyraźnie typizowane.
  • Jeśli funkcja może zwracać void (nic nie zwraca) — powinno to być wskazane: () => void.
  • Zamknięcia, this i przeciążenia również wymagają uwzględnienia przy typizacji.
  • Jeśli funkcja z callbackiem bierze udział w zewnętrznych interakcjach (np. React/Node.js), typy powinny pasować do zewnętrznych deklaracji.

Pytanie z podstępem

Czy konieczne jest podawanie typów parametrów i wartości zwracanej w definicji funkcji callback, jeśli TypeScript potrafi je automatycznie wywnioskować?

Odpowiedź: Nie jest to konieczne, TypeScript potrafi wywnioskować typy argumentów callbacków, jednak w przypadku publicznych API i złożonych funkcji kompozytowych bardzo zaleca się explicite podawać wszystkie typy. Ułatwia to utrzymanie i zapobiega niepożądanym błędom przy zmianach kontraktów funkcji.

Przykłady rzeczywistych błędów z powodu nieznajomości subtelności tematu


Historia

W projekcie używano callbacków bez wyraźnej typizacji wartości zwracanej, a jeden z programistów zaczął zwracać z funkcji string zamiast oczekiwanego boolean. Nie spowodowało to błędu na etapie kompilacji z powodu domyślnego any, ale logika działania funkcji została zepsuta, co doprowadziło do błędu na produkcji.


Historia

W dużym projekcie React zapomniano wyraźnie typizować parametry event-callbacków. Przy przejściu na nową wersję React typy zdarzeń się zmieniły, a kod zaczął kompilować z błędami. Trzeba było pilnie poprawiać funkcję zwrotną na wszystkich stronach.


Historia

W aplikacji Node.js nie był typizowany callback do pracy z funkcją asynchroniczną: otrzymana wartość została błędnie uznana za string, chociaż był to obiekt error. Niezgodność typów doprowadziła do niemożności poprawnej obsługi błędów.