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: `true` dla `string`, `false` dla `number`, złączone z powrotem w `boolean`. 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 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ą.