Przejdź do treści
webtype.orgConditional types

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Konstrukcje

    Conditional types

    Typowy `if`. Pytanie, które zadaje, to zawsze przypisywalność.

    Czym jest

    Nie równość, nie instancja — przypisywalność, w jedną stronę. A gdy sprawdzany typ jest gołym parametrem typu, warunek się dystrybuuje: wykonuje się raz na składnik unii, a wyniki wracają w unię. To jedno zachowanie tłumaczy większość tego, co w standardowej bibliotece wygląda na magię, i większość tego, co w twoich typach wygląda na usterkę.

    Przykłady

    • IsString<'hello'>
      true
    • IsString<string | number>
      boolean

      Zadziałała dystrybucja: `true` dla `string`, `false` dla `number`, złączone z powrotem w `boolean`. Zaskakujące, dopóki nie wiesz; potem oczywiste.

    • NoDistribute<string | number>
      false

      Owinięcie w krotkę wyłącza dystrybucję i teraz unia jest oceniana jako całość.

    Każdy rozwinięty typ powyżej wypisał TypeScript 5.9.3, nie ręka człowieka.

    Czego nie robi

    • Nie testuje równości. `T extends string` jest prawdą także dla każdego literału tekstowego, a pytanie „czy to ten sam typ” wymaga sztuczki z dwoma warunkami, nie tego.
    • Nie dystrybuuje się, gdy sprawdzany typ jest czymkolwiek innym niż gołym parametrem. Owinięcie którejkolwiek strony — w krotkę, obiekt, cokolwiek — to wyłącza.

    Wniosek

    Gdy warunek daje nieoczekiwaną odpowiedź, zapytaj najpierw, czy się rozdystrybuował. `[T] extends [U]` to przełącznik i mniej więcej w połowie przypadków jest naprawą.