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'>→trueIsString<string | number>→booleanZadziałała dystrybucja:
truedlastring,falsedlanumber, złączone z powrotem wboolean. Zaskakujące, dopóki nie wiesz; potem oczywiste.NoDistribute<string | number>→falseOwinięcie w krotkę wyłącza dystrybucję i teraz unia jest oceniana jako całość.
Każdy rozwinięty typ powyżej wypisał TypeScript 6.0.3, nie ręka człowieka.
Czego nie robi
- Nie testuje równości.
T extends stringjest 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ą.

