ตอบสนอง PropTypes กับ Flow


101

PropTypes และ Flow ครอบคลุมสิ่งที่คล้ายกัน แต่ใช้วิธีการที่แตกต่างกัน PropTypes สามารถให้คำเตือนคุณระหว่างรันไทม์ซึ่งจะเป็นประโยชน์ในการค้นหาการตอบสนองที่ผิดรูปแบบที่มาจากเซิร์ฟเวอร์เป็นต้นอย่างไรก็ตาม Flow ดูเหมือนจะเป็นอนาคตและด้วยแนวคิดเช่น generics เป็นโซลูชันที่ยืดหยุ่นมาก นอกจากนี้การเติมข้อความอัตโนมัติที่นำเสนอโดย Nuclide ก็เป็นข้อดีอย่างมากสำหรับ Flow

คำถามของฉันตอนนี้คือวิธีที่ดีที่สุดในการเริ่มโครงการใหม่ หรืออาจเป็นทางออกที่ดีในการใช้ทั้ง Flow และ PropTypes ปัญหาในการใช้ทั้งสองอย่างคือคุณเขียนโค้ดซ้ำกันมาก นี่คือตัวอย่างของแอปเครื่องเล่นเพลงที่ฉันเขียน:

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

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

โดยทั่วไปคำจำกัดความทั้งสองจะมีข้อมูลที่เหมือนกันและเมื่อมีการเปลี่ยนแปลงชนิดข้อมูลจำเป็นต้องอัปเดตคำจำกัดความทั้งสอง

ฉันพบปลั๊กอิน Babelนี้เพื่อแปลงการประกาศประเภทเป็น PropTypes ซึ่งอาจเป็นวิธีแก้ปัญหา


1
หากคุณต้องการเริ่มต้นกับ Flow ลองโพสต์นี้: robinwieruch.de/the-soundcloud-client-in-react-redux-flow
Robin Wieruch

1
จากประสบการณ์การใช้ปลั๊กอินที่กล่าวถึงในคำถามไม่ใช่ความคิดที่ดีมาก ไม่รองรับส่วนประกอบทุกประเภทถูกทำลายด้วย React Native เมื่อ v0.39 และโดยทั่วไปแล้วจะเปราะบางมาก เจ้าของ repo เคยตอบสนองต่อปัญหาเหล่านี้ค่อนข้างเร็ว แต่ดูเหมือนว่าเขาหมดความสนใจและไม่สามารถพึ่งพาเพื่อรักษาได้อีกต่อไป
Tomty

ลองใช้ tcomb ผ่านปลั๊กอิน Babel สำหรับการตรวจสอบประเภทคงที่และรันไทม์โดยใช้ Flow และ tcomb
comerc

คำตอบ:


81

หนึ่งปีหลังจากถามคำถามนี้ฉันต้องการให้ข้อมูลอัปเดตเกี่ยวกับประสบการณ์ของฉันกับปัญหานี้

เมื่อ Flow พัฒนาไปมากฉันก็เริ่มพิมพ์ codebase ด้วยและไม่ได้เพิ่มคำจำกัดความ PropType ใหม่ จนถึงตอนนี้ฉันคิดว่านี่เป็นวิธีที่ดีเพราะตามที่กล่าวไว้ข้างต้นมันช่วยให้คุณไม่เพียง แต่พิมพ์อุปกรณ์ประกอบฉาก แต่ยังรวมถึงส่วนอื่น ๆ ของโค้ดของคุณด้วย สิ่งนี้มีประโยชน์มากเช่นเมื่อคุณมีสำเนาอุปกรณ์ประกอบฉากของคุณอยู่ในสถานะที่ผู้ใช้สามารถแก้ไขได้ นอกจากนี้การเติมข้อความอัตโนมัติใน IDE ยังเป็นผลประโยชน์ที่ยอดเยี่ยม

ตัวแปลงอัตโนมัติในทิศทางใดทิศทางหนึ่งไม่ได้เกิดขึ้นจริง ดังนั้นสำหรับโปรเจ็กต์ใหม่ตอนนี้ฉันขอแนะนำให้ใช้ Flow over PropTypes (ในกรณีที่คุณไม่ต้องการพิมพ์ซ้ำสองครั้ง)


คุณใช้ IDE ใด Webstorm?
sergey.tyan

3
ฉันใช้ Atom กับปลั๊กอิน ide-flowtype
danielbuechele

คุณยังต้องใช้ propTypes เมื่อใช้ childContextTypes - stackoverflow.com/questions/42395113/…
Shyam

3
ไม่จำเป็นต้องใช้ propTypes เมื่อจัดการบริบทย่อยอีกต่อไปเนื่องจากบริบทใหม่ API: reactjs.org/docs/context.html
SteveB

35

นอกเหนือจากทั้งสองที่เป็นของการตรวจสอบประเภทฟิลด์ที่กว้างมากแล้วยังไม่มีความคล้ายคลึงกันมากนักระหว่างทั้งสอง

Flow เป็นเครื่องมือวิเคราะห์แบบคงที่ซึ่งใช้ส่วนเหนือของภาษาช่วยให้คุณสามารถเพิ่มคำอธิบายประกอบประเภทให้กับโค้ดทั้งหมดของคุณและตรวจจับข้อบกพร่องทั้งคลาสในเวลาคอมไพล์

PropTypes เป็นตัวตรวจสอบประเภทพื้นฐานที่ได้รับการแก้ไขบน React ไม่สามารถตรวจสอบสิ่งอื่นใดได้นอกจากประเภทของอุปกรณ์ประกอบฉากที่ส่งผ่านไปยังส่วนประกอบที่กำหนด

หากคุณต้องการการตรวจสอบการพิมพ์ที่ยืดหยุ่นมากขึ้นสำหรับโครงการทั้งหมดของคุณ Flow / TypeScript เป็นตัวเลือกที่เหมาะสม ตราบใดที่คุณส่งเฉพาะประเภทคำอธิบายประกอบไปยังส่วนประกอบคุณก็ไม่จำเป็นต้องใช้ PropTypes

หากคุณต้องการตรวจสอบประเภทของเสาอย่าทำให้ส่วนที่เหลือของโค้ดเบสซับซ้อนเกินไปและใช้ตัวเลือกที่ง่ายกว่า


11
ใช่พวกเขาแตกต่างกันมากในแง่ของวิธีการทำงาน อย่างไรก็ตามฉันคิดว่าจุดประสงค์ของการใช้มันคล้ายกันมาก แต่สิ่งหนึ่งที่คุณชี้ให้เห็นคือจุดที่ดี: Flow ช่วยให้คุณครอบคลุม codebase ของคุณมากขึ้นในขณะที่คุณถูก จำกัด ไว้ที่อุปกรณ์ประกอบฉากเมื่อใช้ PropTypes
danielbuechele

2
วัตถุประสงค์ของการใช้เป็นเพียงที่คล้ายกันมากถ้าคุณเพียงใช้ในการตรวจสอบการไหลของประเภทไม้ค้ำยัน ภาษาหนึ่งเป็นภาษาโดยทั่วไปอีกภาษาหนึ่งเป็นห้องสมุด
Dan Prince

เห็นด้วยอย่างยิ่งกับ @DanPrince และฉันไม่คิดว่านี่เป็นความคิดที่ดีที่จะตรวจสอบการตอบสนองที่ผิดรูปแบบจากเซิร์ฟเวอร์ที่มี PropTypes จะดีกว่าถ้าคุณมีการตรวจสอบด้วยตนเองสำหรับสิ่งนี้และ UI ของคุณตอบสนองอย่างถูกต้อง (เช่นแสดงข้อความเตือน) แทนที่จะส่งคำเตือนลงในคอนโซล
Yan Takushevich

6
@YanTakushevich คุณต้องทำทั้งสองอย่าง PropTypes ควรปิดใช้งานในระหว่างการใช้งานจริงดังนั้นคุณต้องตรวจสอบด้วยตนเองเสมอเพื่อให้แน่ใจว่าผู้ใช้ของคุณได้รับประสบการณ์ที่ดี อย่างไรก็ตาม PropTypes มีประโยชน์มากสำหรับคำเตือนขณะทำงานระหว่างการพัฒนา เป็นเพียงตาข่ายนิรภัยที่ดีเพื่อให้แน่ใจว่าคุณจะไม่ลืมอะไรเลย
ndbroadbent

28

ฉันเชื่อว่าจุดที่พลาดตรงนี้คือFlowเป็นตัวตรวจสอบแบบคงที่ในขณะที่PropTypesเป็นตัวตรวจสอบรันไทม์ซึ่งหมายความว่า

  • ไหลสามารถสกัดกั้นข้อผิดพลาดที่อัปสตรีมได้ในขณะที่เขียนโค้ด: ในทางทฤษฎีอาจพลาดข้อผิดพลาดบางอย่างที่คุณไม่เคยรู้มาก่อน (เช่นหากคุณใช้โฟลว์ในโปรเจ็กต์ไม่เพียงพอหรือในกรณีของอ็อบเจ็กต์ที่ซ้อนกันอยู่ลึก ๆ
  • PropTypesจะจับพวกมันในขณะทดสอบดังนั้นจึงไม่เคยพลาด

1
นี่คือปลั๊กอิน babel โดยเฉพาะแล้วnpmjs.com/package/babel-plugin-flow-react-proptypes
amankkg

15

ลองประกาศประเภทของอุปกรณ์ประกอบฉากโดยใช้ Flow เท่านั้น ระบุประเภทที่ไม่ถูกต้องเช่นตัวเลขแทนสตริง คุณจะเห็นว่าสิ่งนี้จะถูกตั้งค่าสถานะในโค้ดที่ใช้ส่วนประกอบภายในโปรแกรมแก้ไข Flow-Aware ของคุณ อย่างไรก็ตามการดำเนินการนี้จะไม่ทำให้การทดสอบล้มเหลวและแอปของคุณจะยังใช้งานได้

เพิ่มการใช้ React PropTypes ด้วยประเภทที่ไม่ถูกต้อง สิ่งนี้จะทำให้การทดสอบล้มเหลวและถูกตั้งค่าสถานะในคอนโซลเบราว์เซอร์เมื่อเรียกใช้แอป

จากสิ่งนี้ดูเหมือนว่าแม้ว่าจะมีการใช้ Flow แต่ก็ควรระบุ PropTypes ด้วย


ขึ้นอยู่กับวิธีการทดสอบหากคุณใช้การทดสอบสแนปช็อตของ jest การทดสอบจะล้มเหลวด้วยค่าคุณสมบัติที่ไม่ถูกต้อง
Alexandre Borela

3
ข้อดีของข้อผิดพลาดใน IDE ของคุณคือคุณจะเห็นข้อผิดพลาดทันทีก่อนที่จะทำการทดสอบ
Tom Fenech

บวก 1 สำหรับการเข้าใกล้เข็มขัดและสายคาด
David
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.