การตรวจสอบประเภท 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 จะใช้กับการอ้างอิงโครงการได้...
