Hejto.pl
Dodaj post

Wpisz coś do wyszukania (minimum 2 znaki)

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

Specjalista

w Programowanie

16piorunów

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;

```

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.

Teraz spójrzmy na coś bardziej skomplikowanego i przy okazji przekonajmy się, że faktycznie można używać zmiennych w dalszych rozważaniach warunkowych:

```
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

```

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.

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. ( ͡ʘ ͜ʖ ͡ʘ)

Obserwuj tagi  i , aby być na bieżąco!

Komentarze (3)

Osobistość1piorunów

@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

Inspirator2piorunów

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

Inspirator0piorunów

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