idx: Funkcja egzystencjalna
Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →
W Facebooku często potrzebujemy uzyskiwać dostępu do głęboko zagnieżdżonych wartości w strukturach danych pobieranych za pomocą GraphQL. Podczas uzyskiwania dostępu do tych głęboko zagnieżdżonych wartości, typowe jest występowanie jednego lub więcej pól pośrednich, które mogą przyjmować wartość null. Te pola pośrednie mogą być nullem z różnych powodów - od nieudanych kontroli prywatności po sam fakt, że null okazuje się najbardziej elastycznym sposobem reprezentowania błędów niefatalnych.
Niestety, uzyskiwanie dostępu do tych głęboko zagnieżdżonych wartości jest obecnie żmudne i rozwlekłe.
props.user &&
props.user.friends &&
props.user.friends[0] &&
props.user.friends[0].friends;
Istnieje propozycja w ECMAScript wprowadzenia operatora egzystencjalnego, co znacznie uprościłoby tę operację. Ale do czasu finalizacji tej propozycji, potrzebowaliśmy rozwiązania, które poprawi jakość naszego kodu, zachowa istniejącą semantykę języka i wspiera bezpieczeństwo typów dzięki Flow.
Stworzyliśmy w tym celu funkcję egzystencjalną, którą nazwaliśmy idx.
idx(props, _ => _.user.friends[0].friends);
Wywołanie w tym fragmencie kodu zachowuje się podobnie do wyrażenia logicznego w powyższym przykładzie, ale z znacznie mniejszą ilością powtórzeń. Funkcja idx przyjmuje dokładnie dwa argumenty:
-
Dowolną wartość, zazwyczaj obiekt lub tablicę, w której chcesz uzyskać dostęp do zagnieżdżonej wartości.
-
Funkcję, która otrzymuje pierwszy argument i uzyskuje dostęp do zagnieżdżonej wartości na nim.
Teoretycznie, funkcja idx będzie przechwytywać błędy wynikające z odwoływania się do właściwości na null lub undefined. Jeśli taki błąd zostanie przechwycony, zwróci null lub undefined. (Możesz zobaczyć, jak można to zaimplementować w idx.js.)
W praktyce przechwytywanie każdego zagnieżdżonego dostępu do właściwości jest wolne, a rozróżnianie konkretnych rodzajów błędów TypeError jest niestabilne. Aby rozwiązać te problemy, stworzyliśmy wtyczkę Babel, która przekształca powyższe wywołanie idx w następujące wyrażenie:
props.user == null
? props.user
: props.user.friends == null
? props.user.friends
: props.user.friends[0] == null
? props.user.friends[0]
: props.user.friends[0].friends;
Na końcu dodaliśmy niestandardową deklarację typu Flow dla idx, która pozwala na prawidłowe sprawdzanie typów podczas przechodzenia w drugim argumencie, jednocześnie umożliwiając zagnieżdżony dostęp do właściwości mogących przyjmować wartość null.
Funkcja, wtyczka Babel i deklaracja Flow są teraz dostępne na GitHubie. Można ich używać instalując pakiety npm idx i babel-plugin-idx, a następnie dodając "idx" do listy wtyczek w pliku .babelrc.
