PropTypes ในแอปพลิเคชันการตอบสนอง TypeScript


123

การใช้React.PropTypesแอปพลิเคชัน TypeScript React มีความหมายหรือไม่หรือเป็นเพียงกรณีของ "เข็มขัดและสายรัด"

เนื่องจากคลาสคอมโพเนนต์ถูกประกาศด้วยPropsพารามิเตอร์ type:

interface Props {
    // ...
}
export class MyComponent extends React.Component<Props, any> { ... }

มีประโยชน์ที่แท้จริงในการเพิ่ม

static propTypes {
    myProp: React.PropTypes.string
}

นิยามคลาส?

คำตอบ:


105

โดยปกติจะไม่มีคุณค่ามากนักในการดูแลทั้งอุปกรณ์ประกอบฉากของคุณเป็นประเภท TypeScript และReact.PropTypesในเวลาเดียวกัน

ต่อไปนี้เป็นบางกรณีที่เป็นประโยชน์:

  • การเผยแพร่แพ็คเกจเช่นไลบรารีคอมโพเนนต์ที่จะใช้โดย JavaScript ธรรมดา
  • การยอมรับและส่งผ่านอินพุตภายนอกเช่นผลลัพธ์จากการเรียก API
  • การใช้ข้อมูลจากไลบรารีที่อาจมีการพิมพ์ไม่เพียงพอหรือถูกต้องถ้ามี

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

TypeScript เวอร์ชันใหม่กว่าสามารถอนุมานประเภทตามReact.PropTypes( PropTypes.InferProps) ของคุณได้แล้ว แต่ประเภทผลลัพธ์อาจใช้งานยากหรืออ้างถึงที่อื่นในโค้ดของคุณ


1
คุณช่วยอธิบายข้อความแรกได้ไหม
เวชสกุล

2
@vehsakul ขออภัยเพื่อความชัดเจนหากคุณกำลังเขียนแพ็คเกจที่จะติดตั้งโดยนักพัฒนาที่ไม่ได้ใช้ TypeScript พวกเขายังคงต้องใช้ PropTypes เพื่อที่จะได้รับข้อผิดพลาดในขณะรันไทม์ หากโปรเจ็กต์ของคุณใช้สำหรับตัวคุณเอง / โปรเจ็กต์ TypeScript อื่น ๆ เท่านั้นอินเตอร์เฟส TypeScript สำหรับอุปกรณ์ประกอบฉากของคุณก็เพียงพอแล้วเพราะโปรเจ็กต์จะไม่สร้าง
Joel Day

1
นี่คือ POC ที่เพิ่ม PropTypes จากอินเทอร์เฟซ typescript ในระดับ Webpack github.com/grncdr/ts-react-loader#what-it-does
borN_free

ฉันต้องการ oneOfType - optionalUnion: PropTypes.oneOfType ([PropTypes.string, PropTypes.number, PropTypes.instanceOf (Message)]) - typescript มีประเภทการรวมกัน แต่ก็ไม่ค่อยให้ฉันเหมือนกัน
Mz

1
ฉันได้เผยแพร่ไลบรารีที่ทำสิ่งนี้เช่นกัน: github.com/joelday/ts-proptypes-transformer มันถูกนำไปใช้เป็นการแปลงคอมไพเลอร์ TypeScript และสร้าง propTypes ที่ถูกต้องสำหรับชื่อสามัญเชิงลึกยูเนี่ยน ฯลฯ มีขอบหยาบอยู่บ้างดังนั้น การมีส่วนร่วมใด ๆ จะยอดเยี่ยม
Joel Day

142

typescript และ PropTypes ตอบสนองวัตถุประสงค์ที่แตกต่างกัน typescript ตรวจสอบชนิดที่รวบรวมเวลาขณะ PropTypes มีการตรวจสอบที่รันไทม์

typescript มีประโยชน์เมื่อคุณเขียนโค้ด: มันจะเตือนคุณหากคุณส่งอาร์กิวเมนต์ผิดประเภทไปยังส่วนประกอบ React ของคุณให้คุณเติมข้อความอัตโนมัติสำหรับการเรียกใช้ฟังก์ชัน ฯลฯ

PropTypes มีประโยชน์เมื่อคุณทดสอบว่าส่วนประกอบโต้ตอบกับข้อมูลภายนอกอย่างไรเช่นเมื่อคุณโหลด JSON จาก API PropTypes จะช่วยคุณแก้จุดบกพร่อง (เมื่ออยู่ในโหมดการพัฒนาของ React) สาเหตุที่คอมโพเนนต์ของคุณล้มเหลวโดยการพิมพ์ข้อความที่เป็นประโยชน์เช่น:

Warning: Failed prop type: Invalid prop `id` of type `number` supplied to `Table`, expected `string`

แม้ว่าจะดูเหมือนว่า typescript และ PropTypes ทำสิ่งเดียวกัน แต่ก็ไม่ได้ทับซ้อนกันเลย แต่เป็นไปได้ที่จะสร้าง PropTypes จาก typescript โดยอัตโนมัติเพื่อที่คุณจะได้ไม่ต้องระบุประเภทสองครั้งดูตัวอย่าง:


1
ประเภท propTypes และ typescript ไม่สามารถซิงค์ได้ง่ายหรือไม่? ใครมีประสบการณ์ซ่อมบำรุงช่วยบอกเราหน่อย
Leonardo

9
นี่คือคำตอบที่ถูกต้อง! PropTypes (รันไทม์) ไม่เหมือนกับการตรวจสอบประเภทคงที่ (เวลาคอมไพล์) ดังนั้นการใช้ทั้งสองอย่างจึงไม่ใช่ 'การออกกำลังกายที่ไร้จุดหมาย'
ฮันส์

1
นี่เป็นคำอธิบายที่ดีเกี่ยวกับวิธีการที่ประเภทคงที่สามารถอนุมานได้จาก PropTypes: dev.to/busypeoples/…
hans

เวลารันไทม์เทียบกับเวลาคอมไพล์ไม่สมเหตุสมผลเมื่อคุณมี vue cli พร้อม hot reload และ eslint ซึ่งสร้างข้อผิดพลาดในการบันทึก
Julia

1
@ Julia การรีโหลดแบบร้อนไม่มีอะไรที่เหมือนกันกับรันไทม์ แม้จะมีการรีโหลดใหม่คุณก็ไม่มีเงื่อนงำอะไรที่จะได้รับคืนจริงโดย api
Kostya Tresko

4

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

สถานการณ์ดังกล่าวจะเกิดขึ้นเมื่อประมวลผลข้อมูลจากแหล่งภายนอกที่ไม่มีข้อกำหนดประเภทเช่น API ภายนอกที่อยู่นอกเหนือการควบคุมของคุณ สำหรับ API ภายในฉันคิดว่ามันคุ้มค่ากับความพยายามที่จะเขียน (หรือดีกว่าสร้าง) คำจำกัดความประเภทหากยังไม่พร้อมใช้งาน

นอกเหนือจากนั้นฉันไม่เห็นประโยชน์ใด ๆ (ซึ่งฉันทำไมฉันไม่เคยใช้มันเป็นการส่วนตัว)


7
การตรวจสอบ PropTypes ยังเหมาะสมในการตรวจสอบความถูกต้องของโครงสร้างข้อมูลที่โหลดแบบ dymanically (มาจากเซิร์ฟเวอร์ผ่าน AJAX) PropTypes คือการตรวจสอบรันไทม์ดังนั้นจึงสามารถช่วยในการดีบักสิ่งต่างๆได้ เนื่องจากปัญหาจะส่งออกข้อความที่ชัดเจนและเป็นมิตรกับมนุษย์
e1v
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.