ข้อผิดพลาดเวลาเรียกใช้ - บังคับใช้ชนิดกับข้อมูลที่ไม่มีชนิดใน TypeScript
ฉันสงสัยว่ามีเครื่องมือหรือเทคนิคใดบ้างที่ถูกใช้ในการตรวจสอบระดับต่ำของข้อมูลวัตถุเมื่อใช้ TypeScript ตัวอย่างเช่น ร่าง JSON ของคำขอ POST บนบริการ HTTP โดยปกติฉันสร้างอินเทอร์เฟซสำหรับข้อมูลที่คาดว่าจะได้รับแล้วแปลงข้อมูลนั้นไปเป็นอินเทอร์เฟซนั้น แต่ฉันทราบว่านี่เป็นเพียงการตรวจสอบผิวเผิน
ตัวอย่าง :
router.route('/supercres')
.get((req, res, next) => {
const typedBody = <SuperCresBody>req.body;
})
interface SuperCresBody {
name: string,
yoyo: boolean,
}
ปัญหาเกี่ยวกับการบังคับใช้ interface คือ TypeScript เป็นเพียงแนวคิดในช่วงเวลาคอมไพล์และไม่บังคับใช้อะไรในเวลารันไทม์ เมื่อรู้อย่างนี้ฉันสงสัยว่ามีใครพบวิธีเจ๋ง ๆ โดยไม่ต้องใช้โค้ดซ้ำหรือเครื่องมือมากมายเพื่อทำการตรวจสอบประเภทในเวลารันไทม์สำหรับสิ่งเหล่านี้โดยไม่ต้องทำซ้ำสัญญาของ interface เป็นชุดของการตรวจสอบแบบเชิงคำสั่งเป็นขั้นตอนการยืนยันหรือไม่
ในเรื่องที่เกี่ยวข้องเล็กน้อย ในตอนล่าสุดของ Functional Geekery Matthias Felleisen อธิบายความต้องการที่คล้ายกันใน Typed Racket ใกล้ตอนท้ายของตอนนั้น
การอ่านที่เกี่ยวข้อง:
- การรวมการตรวจสอบประเภทแบบสถิติกับแบบรันไทม์เพื่อประสิทธิภาพการพัฒนาที่ดียิ่งขึ้น
คำตอบ #1
ตรวจสอบโครงการที่เทียบเท่ากันทั้ง 2 โครงการนี้:
- https://github.com/gcanti/io-ts
- https://github.com/pelotom/runtypes
ฉันใช้รุ่นล่าสุด มันทำงานได้อย่างไร้ที่ติ แต่รุ่นก่อนหน้าก็ดูยอดเยี่ยมเช่นกัน
ในทั้งสองกรณี คุณสร้างตัวตรวจสอบที่คุณใช้เพื่อ:
- ตรวจสอบวัตถุในขณะรันไทม์
- แยกประเภทคงที่ที่สามารถใช้ได้ในเวลาคอมไพล์
ในกรณีการใช้งาน (api) เฉพาะของคุณ คุณยังสามารถใช้เครื่องมือบางอย่างเพื่อดึงประเภท TS จาก JSON หรือ XML ที่คุณสร้างได้
คุณสามารถสร้างไทป์จากข้อมูล JSON ได้อย่างง่ายดายด้วย:
http://json2ts.com/