Tìm kiếm trang web

node.js - Bao gồm Typings tùy chỉnh trong module npm index.d.ts


Hiện tại tôi đang viết một plugin cho mongoose. Bây giờ khi tôi đang sử dụng TypeScript, tôi gặp phải tình huống sau. Tôi phải mở rộng Interface hiện có. Điều này không vấn đề gì. Vì lý do đầy đủ, tôi sẽ viết nó ra dù sao đi nữa

src/typings/mongoose.d.ts

declare module 'mongoose' {
  export interface SomeExistingMongooseInterface {
    MyNewOption?: FancyOptionInterface
  }
}

sẽ mở rộng giao diện hiện có thông qua Hợp nhất Khai báo

Tôi bao gồm typeRoot trong tsconfig của mình

tsconfig.json

"compilerOptions" : {
  ...
  "typeRoots": {
    "src/types",
    "node_modules/@types"
  }
}

Khi xây dựng module npm của tôi, tôi sử dụng cờ --declare để xuất các loại. Bây giờ vấn đề là, các kiểu tùy chỉnh không thấy đâu cả. Tất nhiên, tôi có thể thêm nội dung của nó thủ công vào ./dist/index.d.ts của mình, điều này sẽ hoạt động nhưng đây không thực sự là một phương án vì nó không thể tự động hóa và sẽ để lại nhiều khả năng xảy ra lỗi.

Có cách thực hành tốt nào để làm điều này sao cho nó hoạt động với trình biên dịch TypeScript hoặc ít nhất là một module npm có thể xử lý việc này không?

Câu trả lời #1

Được rồi. Cuối cùng tôi cũng làm cho nó hoạt động. Đây là những gì tôi đã làm để triển khai

Kiểu tùy chỉnh cho module npm của bên thứ ba trong module npm của bạn

Thay vì viết một tệp .d.ts, chỉ cần chuyển sang tệp .ts thông thường. Vì vậy trong trường hợp của tôi

src/types/mongoose.ts

declare module 'mongoose' {
  export interface SomeExistingMongooseInterface {
    MyNewOption?: FancyOptionInterface
  }
}

Bước thứ hai là nhập tệp này vào ứng dụng của bạn. Tôi chỉ thấy thuận tiện khi thêm nó vào tệp gốc nên

src/index.ts

import "./types/mongoose"

Và đó là tất cả. Không còn gì phải làm nữa. Khi xây dựng ứng dụng, trình biên dịch TypeScript bây giờ sẽ tạo ra một tệp mongoose.d.ts trong thư mục dist/src/types và tệp này sẽ được xuất bản sau đó.

Mọi thứ sẽ hoạt động tốt và nếu bạn chọn xuất bản điều này lên npm, người dùng của bạn cũng sẽ được hưởng lợi từ việc giao diện bên thứ ba được mở rộng.

Câu trả lời #2

Bạn cũng có thể làm như thế này trong một trong những tệp gốc chính của bạn-

/// <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

Bài viết liên quan