Słowo kluczowe infer, czyli zmienne w typach warunkowych.

Słowo kluczowe infer, czyli zmienne w typach warunkowych.

hejto.pl
Dzisiaj coś krótkiego, bo dzień roboczy mi się masakrycznie przedłużył. Słowo kluczowe infer pozwala nam definiować swego rodzaju zmienne w typach warunkowych i wykorzystywać je do przeprowadzania dalszych operacji warunkowych. Możemy je też po prostu zwrócić.
Przejdźmy przez prosty przykład. Wyodrębnijmy typ zwracany przez funkcję:
type ReturnType<T> = T extends (...args: any\[\]) => infer R ? R : any;<br /> ```<br /> Na początku sprawdzamy czy typ generyczny **T** jest funkcją, jednocześnie deklarując zmienną **R** w miejscu tego, co powinno zostać zwrócone. Jeżeli **T** jest faktycznie funkcją to zwracamy **R**, jeżeli nie to zwracamy typ **any**.<br /> Teraz spójrzmy na coś bardziej skomplikowanego i przy okazji przekonajmy się, że faktycznie można używać zmiennych w dalszych rozważaniach warunkowych:<br /> ```<br /> type Awaited<T> = T extends null ? T : T extends object & { then(onfulfilled: infer F): any; } ? F extends (value: infer V, ...args: any) => any ? Awaited<V> : never : T<br /> ```<br /> Woah, to wygląda już ciekawiej. Dobra, lecimy od początku. Jeżeli typ **T** jest **null**, to zwracamy po prostu **T**. Dalej, jezeli **T** nie jest wartością prymitywną (typ **object** to wszystko, co nie prymitywne) i jest na nim zdefiniowane pole z funkcją **then** to wyciągamy typ **F** i znowu sprawdzamy czy **F** jest funkcją, wyciągamy typ **V** i rekursywnie wywołujemy na nim **Awaited**, bo pamiętajmy, że **Promise** można łączyć w łańcuchy.<br /> Ciężko to się czyta, szczególnie w takiej skondensowanej postaci. Mam nadzieję, że udało Wam się też załapać o co w tym wszystkim chodzi. ( ͡ʘ ͜ʖ ͡ʘ)<br /> Obserwuj tagi [#typescript](/tag/typescript) i [#magicznytypescript](/tag/magicznytypescript), aby być na bieżąco!

Komentarze (3)

Mickey

Ej, ale mi się podobają artykuły pisane tutaj w ten właśnie sposób, wygląda to genialnie i prosto

xczar0

Jeśli mogę - nie programuje w typescript, tylko #abap i okazjonalnie #js i liznąłem c# oraz jave, ale to co w tych przykładach to wygląda jak zaprzeczenie czystego kodu xD

nyszom

@xczar0 też siedzę w abap (z domieszką różnych technologii), ale jak ostatnio spojrzałem na Kotlin, w którym pełno jest takich 'nowoczesnych' składni, to się zdziwiłem jak bardzo się odchodzi od tego co ja uważam za czysty kod

Zaloguj się aby komentować