ค้นหาเว็บไซต์

ข้อผิดพลาดเวลาเรียกใช้ - บังคับใช้ชนิดกับข้อมูลที่ไม่มีชนิดใน 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/

บทความที่เกี่ยวข้อง