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

การตรวจสอบประเภท TypeScript tsc พร้อมการอ้างอิงใน monorepos


ฉันกำลังใช้ Yarn Workspaces และฉันต้องการคำสั่ง cli เพื่อตรวจสอบประเภทของไฟล์ ts แหล่งที่มาของฉันที่อยู่ที่ packages/*

โดยเดิมฉันสร้างโปรเจกต์ของฉันโดยใช้ webpack (พร้อมกับ esbuild ซึ่งไม่ตรวจสอบประเภท) และตรวจสอบประเภทด้วย tsc --noEmit แยกต่างหาก และมันทำงานร่วมกันได้ดีมาก

หลังจากเปลี่ยนไปใช้ Yarn Workspaces ฉันได้แยกโครงการทั้งหมดของฉันออกเป็นแพ็กเกจขนาดเล็กหลายตัว

โครงการทั้งหมดเป็นแบบนี้:

packages/
  foo/
    index.ts          // import bar from 'bar'; console.log(bar);
    package.json      // { "name": "foo" }
    tsconfig.json     // { "references": [ { "path": "../bar" } ] }
  bar/
    index.ts          // export default "hello world";
    package.json      // { "name": "bar" }
    tsconfig.json     // { "compilerOptions": { "composite": true } }
package.json          // { "workspaces": [ "packages/*" ] }

แล้วฉันก็พบว่า tsc ล้มเหลวในการรัน เมื่อฉันลอง tsc --noEmit -p packages/foobar มันล้มเหลวพร้อมกับข้อผิดพลาดมากมายเช่น:

Output file '/packages/foobar/index.d.ts' has not been built from source file '/packages/foobar/index.ts'.

อย่างไรก็ตาม webpack ทำงานได้ดีมาก

หลังจากท่องอินเทอร์เน็ต เอกสารทางการบอกฉันว่าฟีเจอร์ทั้งสองนี้สามารถใช้ได้เฉพาะในโหมดสร้างเท่านั้น แต่เมื่อฉันลองใช้ tsc --noEmit -b packages/foobar มันก็ล้มเหลวเนื่องจากความขัดแย้งระหว่างแฟล็ก --noEmit กับโหมดสร้าง นอกจากนี้ หากฉันลบแฟล็ก --noEmit ออกจากคำสั่ง tsc จะพยายามสร้างไฟล์ .js จำนวนมากให้ฉัน แต่ฉันไม่ต้องการให้ไฟล์เหล่านั้นถูกสร้าง

ฉันแค่อยากได้คำสั่ง CLI เพื่อตรวจสอบประเภทโดยไม่ต้องสร้างไฟล์เพิ่มเติมเหมือนที่ IDE ของฉันทำ ฉันจะรัน tsc ได้อย่างถูกต้องได้อย่างไร? หรือมีทางเลือกอื่นสำหรับเรื่องนี้ไหม?

คำตอบ #1

เพิ่งเจอปัญหาเดียวกัน และ "แก้ไข" โดยใช้ TS Project References และฉันได้เพิ่มสิ่งต่อไปนี้ลงใน tsconfig.json ของฉัน

"compilerOptions": {
  ...
  "emitDeclarationOnly": true,
  ...
}

นี่บอกคอมไพเลอร์ Typescript ให้ไม่แปลงโค้ด TS เป็น JS เลย แต่เพียงส่งออกไฟล์ .d.ts สำหรับประกาศเท่านั้น

จากนั้นใน package.json ของฉัน:

scripts: {
   "lint": "tsc -b"
}
"

นี่จะสร้างการอ้างอิงโครงการ TS ใด ๆ และโครงการที่คุณกำลังรัน tsc อยู่ อย่างไรก็ตามเนื่องจากเราเปิดใช้งาน 'emitDeclarationOnly' ไว้ มันจะสร้างเฉพาะไฟล์คำประกาศสำหรับโครงการนี้เท่านั้น

คำตอบ #2

ลองเพิ่ม typescript เป็นการพึ่งพาใน package.json ของแพ็กเกจที่คุณต้องการให้ตรวจสอบ

(แก้ไข): นอกจากนี้ยังดูเหมือนไม่ว่า tsc --noemit จะใช้กับการอ้างอิงโครงการได้...

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