Reaguj PropTypes vs. Flow

101

PropTypes i Flow obejmują podobne rzeczy, ale używają różnych podejść. PropTypes może generować ostrzeżenia w czasie wykonywania, co może być pomocne w szybkim znajdowaniu źle sformułowanych odpowiedzi pochodzących z serwera itp. Jednak Flow wydaje się być przyszłością, a koncepcje takie jak generics są bardzo elastycznym rozwiązaniem. Również autouzupełnianie oferowane przez Nuclide jest dużym plusem dla Flow.

Moje pytanie brzmi teraz, co jest najlepszą drogą do rozpoczęcia nowego projektu. A może dobrym rozwiązaniem byłoby użycie zarówno Flow, jak i PropTypes? Problem z używaniem obu polega na tym, że piszesz dużo zduplikowanych kodów. Oto przykład aplikacji do odtwarzania muzyki, którą napisałem:

export const PlaylistPropType = PropTypes.shape({
    next: ItemPropTypes,
    current: ItemPropTypes,
    history: PropTypes.arrayOf(ItemPropTypes).isRequired
});

export type Playlist = {
    next: Item,
    current: Item,
    history: Array<Item>
};

Obie definicje zawierają zasadniczo te same informacje, a po zmianie typu danych należy zaktualizować obie definicje.

Znalazłem tę wtyczkę Babel do konwersji deklaracji typu na PropTypes, co może być rozwiązaniem.

danielbuechele
źródło
1
Jeśli chcesz zacząć korzystać z Flow, wypróbuj ten post: robinwieruch.de/the-soundcloud-client-in-react-redux-flow
Robin Wieruch
1
Z doświadczenia wynika, że ​​użycie wtyczki, o której mowa w pytaniu, nie jest dobrym pomysłem. Nie obsługuje wszystkich typów komponentów, jest całkowicie zepsuty w React Native od wersji 0.39 i ogólnie jest bardzo delikatny. Właściciel repozytorium zwykle reagował na te problemy dość szybko, ale wydaje się, że stracił zainteresowanie i nie można już na nim polegać.
Tomty
Wypróbuj tcomb przez wtyczkę Babel do sprawdzania typów statycznych i wykonawczych za pomocą Flow i tcomb.
comerc

Odpowiedzi:

81

Rok po zadaniu tego pytania chciałem podzielić się z innymi moimi doświadczeniami z tym problemem.

Ponieważ Flow bardzo się rozwinął, zacząłem pisać za jego pomocą moją bazę kodu i nie dodałem żadnych nowych definicji PropType. Na razie myślę, że to dobry sposób, ponieważ jak wspomniano powyżej, pozwala nie tylko wpisywać rekwizyty, ale także inne części kodu. Jest to bardzo przydatne, na przykład, gdy masz kopię swoich właściwości w stanie, które użytkownik może modyfikować. Ponadto autouzupełnianie w IDE to niesamowity zysk.

Automatyczne konwertery w jednym lub drugim kierunku tak naprawdę nie wystartowały. Tak więc w przypadku nowych projektów naprawdę poleciłbym teraz używanie Flow zamiast PropTypes (na wypadek, gdybyś nie chciał pisać dwa razy).

danielbuechele
źródło
którego IDE używasz? Burza internetowa?
sergey.tyan
3
Używam Atom z wtyczką ide-flowtype.
danielbuechele
nadal potrzebujesz propTypes podczas korzystania z childContextTypes - stackoverflow.com/questions/42395113/…
gkd
3
nie ma już potrzeby używania propTypes podczas obsługi kontekstów potomnych dzięki nowemu interfejsowi API kontekstu: awarejs.org/docs/context.html
SteveB
35

Poza tym, że oba należą do bardzo szerokiego pola sprawdzania typów, nie ma między nimi dużego podobieństwa.

Flow to narzędzie do analizy statycznej, które wykorzystuje nadzbiór języka, umożliwiając dodawanie adnotacji typu do całego kodu i wychwytywanie całej klasy błędów w czasie kompilacji.

PropTypes to podstawowe narzędzie do sprawdzania typów, które zostało załatane w React. Nie może sprawdzić niczego poza typami właściwości przekazywanych do danego komponentu.

Jeśli chcesz bardziej elastycznego sprawdzania czcionek dla całego projektu, Flow / TypeScript są odpowiednim wyborem. Dopóki przekazujesz tylko typy z adnotacjami do komponentów, nie będziesz potrzebować PropTypes.

Jeśli chcesz tylko sprawdzić typy rekwizytów, nie komplikuj zbytnio reszty kodu i wybierz prostszą opcję.

Dan Prince
źródło
11
Tak, bardzo różnią się sposobem działania. Myślę jednak, że cel ich używania jest bardzo podobny. Ale jedna rzecz, na którą zwróciłeś uwagę, jest dobra: Flow pozwala ci zająć się większą częścią twojego kodu, podczas gdy używasz rekwizytów, gdy używasz PropTypes.
danielbuechele
2
Cel użycia jest bardzo podobny tylko wtedy, gdy używasz Flow tylko do sprawdzania typów rekwizytów. Jeden to po prostu język, drugi to ledwie biblioteka.
Dan Prince,
Całkowicie zgadzam się z @DanPrince. I nie sądzę, aby sprawdzanie źle sformułowanych odpowiedzi z serwera za pomocą PropTypes nie było dobrym pomysłem. Lepiej jest, jeśli masz ręczne sprawdzenie tego, a twój interfejs użytkownika reaguje prawidłowo (na przykład wyświetla komunikat ostrzegawczy), zamiast po prostu wrzucać ostrzeżenie do konsoli.
Yan Takushevich
6
@YanTakushevich Musisz zrobić jedno i drugie. PropTypes i tak powinny być wyłączone podczas produkcji, więc zawsze potrzebujesz ręcznego sprawdzenia, aby upewnić się, że użytkownicy mają dobre wrażenia. Jednak PropTypes może być bardzo przydatne w przypadku ostrzeżeń w czasie wykonywania podczas programowania. To po prostu fajna siatka bezpieczeństwa, dzięki której niczego nie zapomnisz.
ndbroadbent
27

Uważam, że brakującym punktem jest to, że Flow jest statycznym narzędziem do sprawdzania, podczas gdy PropTypes jest narzędziem do sprawdzania środowiska uruchomieniowego , co oznacza

  • Flow może przechwytywać błędy podczas kodowania: teoretycznie może przeoczyć niektóre błędy, o których nie wiesz (na przykład jeśli nie zaimplementowałeś wystarczająco przepływu w swoim projekcie lub w przypadku głęboko zagnieżdżonych obiektów)
  • PropTypes będzie je przechwytywać podczas testowania, więc nie da się tego przegapić
Rewieer
źródło
1
tutaj jest dedykowana wtyczka Babel już npmjs.com/package/babel-plugin-flow-react-proptypes
amankkg
15

Spróbuj zadeklarować typ rekwizytów, używając tylko Flow. Podaj nieprawidłowy typ, taki jak liczba zamiast ciągu. Zobaczysz, że zostanie to oznaczone w kodzie używającym komponentu w edytorze Flow-aware. Jednak nie spowoduje to niepowodzenia testów, a Twoja aplikacja będzie nadal działać.

Teraz dodaj użycie React PropTypes z nieprawidłowym typem. SPOWODUJE to niepowodzenie testów i oznaczenie ich w konsoli przeglądarki po uruchomieniu aplikacji.

Na tej podstawie wydaje się, że nawet jeśli używany jest Flow, należy również określić PropTypes.

Mark Volkmann
źródło
Zależy to od tego, jak testy są wykonywane, jeśli używasz testowania migawki jest, testy zakończą się niepowodzeniem z nieprawidłowymi wartościami właściwości.
Alexandre Borela
3
Zaletą błędu w IDE jest to, że widzisz go tuż przed uruchomieniem testów.
Tom Fenech,
Plus 1 za podejście do pasa i szelek.
David A. Gray