typescript ไม่คัดลอกไฟล์ d.ts เพื่อสร้าง

May 07 2019

บางทีฉันก็สับสน แต่ฉันคิดว่าถ้าฉันเพิ่มลงdeclaration:trueใน tsconfig.json ของฉันฉันจะให้ tsc คัดลอก*.d.tsไฟล์ของฉันไปพร้อมกับโค้ดที่โปร่งใสและมันเป็นd.tsไฟล์?

เช่น:

- src
 - lib
   - types.d.ts
   - foo.ts

ฉันคาดหวังว่าผลลัพธ์ของ tsc จะเป็นดังนี้:

- build
 - lib
   - types.d.ts
   - foo.js
   - foo.d.ts

อย่างไรก็ตามดูเหมือนว่าฉันไม่สามารถtypes.d.tsคัดลอกไปยังไดเร็กทอรีบิลด์ของฉันได้

typescript ไม่มีกลไกในการคัดลอก.d.tsไฟล์หรือไม่? หรือฉันแค่มีการกำหนดค่าผิดที่ใดที่หนึ่ง? (ฉันได้ลองใช้การกำหนดค่าต่างๆมากมาย ณ จุดนี้ดูเหมือนจะไม่มีอะไรได้ผล)

คำตอบ

25 ford04 Jun 04 2019 at 08:43

คุณพูดถูก - declaration:trueหมายความว่าเฉพาะสำหรับแต่ละ.tsไฟล์ที่กำหนดเท่านั้นที่tscสร้างและคัดลอก.d.tsไฟล์เอาต์พุตที่เกี่ยวข้องไปยังbuildไดเร็กทอรี (นอกเหนือจาก.jsและ.mapถ้ามี) ดังนั้นtscจะไม่คัดลอกtypes.d.tsไฟล์ที่กำหนดเองของคุณไปยังไดเร็กทอรีเอาต์พุต

โดยทั่วไป.d.tsไฟล์จะถูกมองว่าเป็นอินพุตที่ไม่สามารถแตะต้องได้เพื่อให้คอมไพเลอร์ทำการตรวจสอบประเภท พวกเขาจะไม่ได้ใช้สำหรับการสร้างผลใด ๆ buildซึ่งหมายความว่าพวกเขาไม่ได้คัดลอกไปยัง คุณสามารถอ่านเพิ่มเติมhttps://github.com/Microsoft/TypeScript/issues/5112 เกี่ยวกับจุดยืนของผู้ดูแล:

ไฟล์. d.ts ที่คุณใช้เป็นอินพุตของระบบบิลด์ แต่ไม่ใช่เอาต์พุต มันสมเหตุสมผลอย่างยิ่งที่จะบริโภคบางประเภทจาก a .d.ts แต่หากเอาต์พุตของคุณไม่ได้ใช้ประเภทเหล่านั้นดังนั้นจึงไม่มีเหตุผลที่จะแจกจ่ายอินพุต. d.ts พร้อมกับผลลัพธ์การสร้างของคุณ [... ] ดูเหมือนว่าคุณจะต้องการขั้นตอนหลังการสร้างในเครื่องมือสร้างของคุณเพื่อคัดลอกไฟล์. d.ts ที่เกี่ยวข้องทุกที่ที่คุณต้องการ

ไฟล์. d.ts ถือเป็น "ข้อมูลอ้างอิง" ที่คอมไพเลอร์จะไม่แตะต้องไม่ย้ายหรือสร้างขึ้นใหม่ วิธีง่ายๆในการคิดไฟล์. d.ts คือไปพร้อมกับไฟล์. js ของคุณ หากคุณกำลังคัดลอกไฟล์. js คุณควรคัดลอก. d.ts ที่ตรงกัน

โซลูชัน # 1: คัดลอกไฟล์ d.ts ผ่านขั้นตอนการสร้างด้วยตนเอง

วิธีแก้ไขที่เป็นไปได้คือการคัดลอก.d.tsไฟล์ที่จำเป็นทั้งหมดtypes.d.tsด้วยตนเองในขั้นตอนการสร้าง เครื่องมือที่เป็นรูปธรรมคือความชอบและอยู่ในความอุปการะของโครงการและประเภทการสร้างระบบปฏิบัติการของคุณ เครื่องมือนี้ควรรักษาโครงสร้างไดเร็กทอรีไว้ภายใต้srcเมื่อคัดลอกไฟล์ไปbuildเพื่อให้importการอ้างอิงประเภทนั้นยังคงทำงานได้ หากต้องการชื่อไม่กี่:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(เปลือก) rsync, robocopyหรือแพคเกจแพลตฟอร์ม NPM อิสระเช่นhttps://www.npmjs.com/package/copyfiles:

"scripts": {
  "copy-dts": "copyfiles -u 1 \"src/**/*.d.ts\" build"
}

โซลูชัน # 2: Reword d.ts ไฟล์เป็นนามสกุล. ts

บันทึก.d.tsไฟล์ของคุณเป็น.tsนามสกุล (หรือรวมประเภทเข้ากับ.tsไฟล์ที่มีอยู่อีกครั้ง) ดังนั้นให้tscดูแลการเปล่งคำประกาศในเอาต์พุต ข้อเสียเล็กน้อย: คุณไม่มีการบังคับใช้คอมไพเลอร์ที่บังคับให้แยกระหว่างประเภทและโค้ดการนำไปใช้งาน ( d.tsไฟล์ไม่ได้รับอนุญาตให้มีโค้ด) ข้อดีคือคุณไม่จำเป็นต้องมีขั้นตอนการสร้างเพิ่มเติม

ในความคิดของฉันวิธีหลังเป็นวิธีที่ง่ายที่สุดในการสร้าง API สาธารณะเช่นสำหรับแพ็คเกจ npm ของคุณในขณะที่.d.tsไฟล์สามารถสร้างผู้สมัครสำหรับการประกาศประเภทที่ใช้ภายในและใช้ร่วมกันได้

หวังว่าจะช่วยได้