Hvorfor håndhever ikke TypeScript en generisk parameter i callback?
Vurder denne TypeScript-koden, kompilert med 2.6.1:
function foo<T> (bar: T, baz: (T) => void) {
const test: T = bar;
baz(test);
}
const string: string = "a";
foo(string, num => num.parseInt());
Jeg ville forvente at kompileringen feiler, fordi funksjonen foo blir kalt med en string, men den sendte callback-funksjonen bruker en metode som ikke er tilgjengelig i string -- mens funksjonssignaturen indikerer at typen av argument i callback-funksjonen bør være den samme som typen til den første parameteren.
Imidlertid kompilerer koden, og deretter feiler den under kjøring.
Hva går jeg glipp av?
Svar #1
Vel, fordi T i baz: (T) => void ikke er et typenavn, det er et parameternavn.
Når du fikser syntaksen for å bety det du vil at den skal bety, får du den forventede feilen:
function foo<T> (bar: T, baz: (t: T) => void) {
const test: T = bar;
baz(test);
}
const s: string = "a";
foo(s, num => num.parseInt());
// Property 'parseInt' does not exist on type 'string'.
Selvfølgelig, det er virkelig vanskelig å oppdage feil som denne - jeg så det bare da jeg limte koden din inn i TypeScript-playground og slo på --noImplicitAny. (T) ble umiddelbart markert med Parameter 'T' har implisitt typen 'any'. Selv den feilen var forvirrende for et øyeblikk - vent, hva - T er ikke en parameter, det er en type - ...!
