node.js - รวม Typings ที่กำหนดเองในโมดูล npm index.d.ts
ฉันกำลังเขียนปลั๊กอินสำหรับ mongoose ตอนนี้เนื่องจากฉันกำลังใช้ TypeScript ฉันจึงมีสถานการณ์ดังต่อไปนี้ ฉันต้องขยาย Interface ที่มีอยู่ นี่ไม่ใช่ปัญหา สำหรับความสมบูรณ์ฉันจะเขียนมันลงไปทั้งๆ อย่างไรก็ตาม
src/typings/mongoose.d.ts
declare module 'mongoose' {
export interface SomeExistingMongooseInterface {
MyNewOption?: FancyOptionInterface
}
}
จะขยายอินเทอร์เฟซที่มีอยู่ผ่านการรวมประกาศ
ฉันรวม typeRoot ไว้ใน tsconfig ของฉัน
tsconfig.json
"compilerOptions" : {
...
"typeRoots": {
"src/types",
"node_modules/@types"
}
}
เมื่อสร้างโมดูล npm ของฉัน ฉันใช้แฟลก --declare เพื่อส่งออกประเภทด้วย ตอนนี้ปัญหาคือ การพิมพ์แบบกำหนดเองไม่สามารถหาได้ แน่นอนว่าฉันสามารถเพิ่มเนื้อหาของมันด้วยตนเองไปยัง ./dist/index.d.ts ซึ่งจะใช้งานได้ แต่สิ่งนี้ไม่ใช่ตัวเลือกจริง ๆ เพราะไม่สามารถทำเป็นอัตโนมัติและจะมีโอกาสเกิดข้อผิดพลาดมากมาย
มีแนวทางปฏิบัติที่ดีที่สุดในการทำสิ่งนี้ให้ทำงานกับคอมไพเลอร์ของ TypeScript หรืออย่างน้อยมีโมดูล npm ที่สามารถดูแลเรื่องนี้ได้ไหม?
คำตอบ #1
ตกลง ในที่สุดฉันก็ทำให้มันทำงานได้ นี่คือสิ่งที่ฉันทำเพื่อนำไปใช้งาน
การกำหนดประเภทแบบกำหนดเองสำหรับโมดูล npm ของบุคคลที่สามในโมดูล npm ของคุณ
แทนที่จะเขียนไฟล์ .d.ts ให้เปลี่ยนไปใช้ไฟล์ .ts ปกติ ดังนั้นในกรณีของฉัน
src/types/mongoose.ts
declare module 'mongoose' {
export interface SomeExistingMongooseInterface {
MyNewOption?: FancyOptionInterface
}
}
ขั้นตอนที่สองคือการนำไฟล์นี้เข้ามาในแอปพลิเคชันของคุณ ฉันเพิ่งพบว่ามันสะดวกที่จะเพิ่มมันในไฟล์ราก ดังนั้น
src/index.ts
import "./types/mongoose"
และนั่นก็เป็นทั้งหมดแล้ว ไม่มีอะไรต้องทำเพิ่มเติม เมื่อสร้างแอปพลิเคชัน คอมไพเลอร์ของ TypeScript จะสร้างไฟล์ mongoose.d.ts ในโฟลเดอร์ dist/src/types ซึ่งจะถูกเผยแพร่ภายหลัง
ทุกอย่างจะทำงานได้ดี และหากคุณเลือกที่จะเผยแพร่สิ่งนี้ไปยัง npm ผู้ใช้ของคุณก็จะได้รับประโยชน์จากการที่ส่วนติดต่อบุคคลที่สามถูกขยาย
คำตอบ #2
คุณยังสามารถทำแบบนี้ในหนึ่งในไฟล์หลักของคุณได้ด้วย-
/// <reference path="./path/to/your/src/typings/mongoose.d.ts" />
- https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html
- https://www.typescriptlang.org/docs/handbook/modules.html
