Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

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

    Gra na krótkim dystansie

    Najmniej znaków

    Nie ma jeszcze publicznych wyników.

    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.

    Wykorzystuje