Przejdź do treści
webtype.org#221 return-type · par 3

Nr 221 · 29 lipca 2026 · Średnia

Typ zwracany

Zaimplementuj `MyReturnType<T>`, aby wyciągał to, co zwraca typ funkcyjny, niezależnie od przyjmowanych parametrów. Cokolwiek nie jest funkcją, zwraca `never`.

01

Spróbuj rozwiązać samodzielnie

Par 3

Zagadka

return-type.ts
Podejście 1 z 3Jeszcze nie sprawdzone

Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej. Tab wcina; naciśnij Escape, a potem Tab, by wyjść fokusem.

Testy

4
  • MyReturnType<() => string>
    string
  • MyReturnType<(a: number) => boolean>
    boolean
  • MyReturnType<() => void>
    void
  • MyReturnType<string>
    never

Jak oceniamy test Dokładna równość typów, nie przypisywalność — przecięcie to nie to samo co spłaszczony obiekt.

Jak poszło innym

Tę zagadkę rozwiązało jak dotąd mniej niż 5 osób. Rozkład pojawi się, gdy próbka będzie na tyle duża, by coś znaczyć.

Archiwum
02

Rozwiązanie z komentarzem

Opublikowano 30 lipca 2026

Rozwią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

  1. (...args: never[]) => infer R

    Ponieważ 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`.

  2. 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.