Bereaksi PropTypes vs. Flow

101

PropTypes dan Flow mencakup hal-hal yang serupa tetapi menggunakan pendekatan yang berbeda. PropTypes dapat memberi Anda peringatan selama runtime, yang dapat membantu untuk dengan cepat menemukan respons yang salah format yang berasal dari server, dll. Namun, Flow tampaknya akan menjadi masa depan dan dengan konsep seperti obat generik adalah solusi yang sangat fleksibel. Juga pelengkapan otomatis yang ditawarkan oleh Nuclide merupakan nilai tambah yang besar untuk Flow.

Pertanyaan saya sekarang adalah yang mana cara terbaik untuk pergi, ketika memulai proyek baru. Atau mungkinkah ini solusi yang baik untuk menggunakan keduanya, Flow dan PropTypes? Masalah dengan menggunakan keduanya adalah Anda menulis banyak kode duplikat. Ini adalah contoh aplikasi pemutar musik yang saya tulis:

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

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

Kedua definisi tersebut pada dasarnya berisi informasi yang sama dan ketika tipe datanya diubah, kedua definisi tersebut perlu diperbarui.

Saya menemukan plugin babel ini untuk mengonversi deklarasi tipe ke PropTypes, yang mungkin bisa menjadi solusi.

danielbuechele
sumber
1
Jika Anda ingin memulai Flow, coba posting ini: robinwieruch.de/the-soundcloud-client-in-react-redux-flow
Robin Wieruch
1
Dari pengalaman, menggunakan plugin yang disebutkan dalam pertanyaan bukanlah ide yang bagus. Itu tidak mendukung semua jenis komponen, sepenuhnya rusak dengan React Native pada v0.39, dan umumnya sangat rapuh. Pemilik repo biasanya menanggapi masalah ini dengan cukup cepat, tetapi tampaknya dia kehilangan minat dan tidak dapat lagi diandalkan untuk mempertahankannya.
Tomty
Coba tcomb melalui plugin Babel untuk pemeriksaan jenis statis dan runtime menggunakan Flow dan tcomb.
comerc

Jawaban:

81

Satu tahun setelah menanyakan pertanyaan ini, saya ingin memberikan update tentang bagaimana pengalaman saya dengan masalah ini.

Karena Flow berkembang pesat, saya mulai mengetik basis kode saya dengannya dan tidak menambahkan definisi PropType baru. Sejauh ini, menurut saya ini adalah cara yang baik, karena seperti yang disebutkan di atas, ini memungkinkan Anda untuk tidak hanya mengetik props tetapi juga bagian lain dari kode Anda. Ini sangat berguna misalnya ketika Anda memiliki salinan props Anda dalam keadaan, yang dapat dimodifikasi oleh pengguna. Selain itu, penyelesaian otomatis di IDE merupakan keuntungan yang luar biasa.

Konverter otomatis di satu atau arah lain tidak benar-benar lepas landas. Jadi, untuk proyek baru, saya sekarang sangat merekomendasikan menggunakan Flow over PropTypes (jika Anda tidak ingin melakukan pengetikan dua kali).

danielbuechele
sumber
IDE mana yang Anda gunakan? Badai web?
sergey.tyan
3
Saya menggunakan Atom dengan plugin ide-flowtype.
danielbuechele
Anda masih memerlukan propTypes saat menggunakan childContextTypes - stackoverflow.com/questions/42395113/…
gkd
3
tidak perlu lagi menggunakan propTypes saat menangani konteks anak karena API konteks baru: reactjs.org/docs/context.html
SteveB
35

Selain keduanya termasuk dalam bidang pemeriksaan tipe yang sangat luas, tidak ada banyak kesamaan di antara keduanya.

Flow adalah alat analisis statis yang menggunakan superset dari bahasa tersebut, memungkinkan Anda untuk menambahkan penjelasan jenis ke semua kode Anda dan menangkap seluruh kelas bug pada waktu kompilasi.

PropTypes adalah pemeriksa tipe dasar yang telah ditambal ke React. Itu tidak dapat memeriksa apa pun selain jenis props yang diteruskan ke komponen tertentu.

Jika Anda ingin pemeriksaan jenis yang lebih fleksibel untuk seluruh proyek Anda, maka Flow / TypeScript adalah pilihan yang tepat. Selama Anda hanya meneruskan tipe beranotasi ke dalam komponen, Anda tidak memerlukan PropTypes.

Jika Anda hanya ingin memeriksa jenis prop, jangan terlalu memperumit basis kode Anda dan gunakan opsi yang lebih sederhana.

Dan Prince
sumber
11
Ya, mereka sangat berbeda dalam hal cara kerjanya. Namun, menurut saya tujuan penggunaannya sangat mirip. Tapi satu hal yang Anda tunjukkan adalah poin yang bagus: Flow memungkinkan Anda mencakup lebih banyak basis kode Anda, sedangkan Anda terbatas pada props saat menggunakan PropTypes.
danielbuechele
2
Tujuan penggunaan hanya sangat mirip jika Anda hanya menggunakan Flow untuk memeriksa tipe prop. Yang satu pada dasarnya adalah bahasa, yang lainnya hanyalah perpustakaan.
Dan Pangeran
Sangat setuju dengan @DanPrince. Dan menurut saya ini bukan ide yang baik untuk memeriksa tanggapan yang salah format dari server dengan PropTypes. Lebih baik jika Anda memiliki pemeriksaan manual untuk ini dan UI Anda merespons dengan benar (menampilkan pesan peringatan misalnya) daripada hanya melemparkan peringatan ke konsol.
Yan Takushevich
6
@YanTakushevich Anda perlu melakukan keduanya. PropTypes harus dinonaktifkan selama produksi, jadi Anda selalu memerlukan pemeriksaan manual untuk memastikan bahwa pengguna Anda memiliki pengalaman yang baik. Namun, PropTypes bisa sangat berguna untuk peringatan run-time selama pengembangan. Ini hanya jaring pengaman yang bagus untuk memastikan Anda tidak melupakan apa pun.
ndbroadbent
27

Saya percaya poin yang terlewat di sini adalah bahwa Flow adalah pemeriksa statis sementara PropTypes adalah pemeriksa runtime , yang artinya

  • Flow dapat mencegat kesalahan upstream saat melakukan pengkodean: secara teoritis dapat melewatkan beberapa kesalahan yang tidak akan Anda ketahui (jika Anda tidak mengimplementasikan aliran yang cukup dalam proyek Anda misalnya, atau dalam kasus objek bersarang yang dalam)
  • PropTypes akan menangkapnya saat pengujian, jadi tidak akan pernah terlewat
Rewieer
sumber
1
berikut adalah plugin babel khusus yang sudah ada npmjs.com/package/babel-plugin-flow-react-proptypes
amankkg
15

Coba deklarasikan tipe props hanya dengan menggunakan Flow. Tentukan jenis yang salah, seperti angka, bukan string. Anda akan melihat bahwa ini akan ditandai dalam kode yang menggunakan komponen dalam editor yang sadar-Flow. Namun, ini tidak akan menyebabkan pengujian apa pun gagal dan aplikasi Anda akan tetap berfungsi.

Sekarang tambahkan penggunaan React PropTypes dengan tipe yang salah. Ini AKAN menyebabkan pengujian gagal dan ditandai di konsol browser saat aplikasi dijalankan.

Berdasarkan ini, tampaknya meskipun Flow sedang digunakan, PropTypes juga harus ditentukan.

Mark Volkmann
sumber
Itu tergantung pada bagaimana pengujian dilakukan, jika Anda menggunakan pengujian snapshot jest, pengujian akan gagal dengan nilai properti yang tidak valid.
Alexandre Borela
3
Keuntungan dari kesalahan di IDE Anda adalah Anda dapat melihatnya segera bahkan sebelum Anda menjalankan pengujian.
Tom Fenech
Ditambah 1 untuk pendekatan sabuk dan bretel.
David A. Gray