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

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

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