Rozwiązanie z komentarzem
Opublikowano 30 lipca 2026Rozwiązanie
type MyReturnType<T> = T extends (...args: never[]) => infer R ? R : never
Najczęstsza błędna odpowiedź
type MyReturnType<T> = T extends () => infer R ? R : never
Wzorzec bez parametrów pasuje tylko do funkcji bez parametrów, więc `(a: number) => boolean` wpada do `never`. Wzorzec musi być pobłażliwy wobec parametrów, by być pobłażliwym wobec sygnatur.
Linia po linii
(...args: never[]) => infer RPonieważ parametry są kontrawariantne, lista parametrów `never[]` jest przypisywalna *z* każdej innej listy. To bezpieczny sposób na zapisanie „funkcja dowolnego kształtu” bez sięgania po `any`.
infer R`infer` w pozycji zwracanej prosi kompilator o rozwiązanie tego, co tam stoi. To ten sam mechanizm co wnioskowanie typu elementu z tablicy — zmienia się tylko pozycja.
Do zapamiętania
`infer` można umieścić wszędzie tam, gdzie we wzorcu może pojawić się typ. Większość pomocników wyciągających z biblioteki standardowej to jeden warunek z jednym `infer` we właściwym miejscu.