Typecript không sao chép tệp d.ts để xây dựng

May 07 2019

Vì vậy, có lẽ tôi đang nhầm lẫn, nhưng tôi nghĩ rằng nếu tôi thêm vào declaration:truetsconfig.json của mình, tôi có thể yêu cầu tsc sao chép *.d.tscác tệp của tôi , cùng với mã chuyển và đó là d.tstệp?

VÍ DỤ:

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

Tôi mong đợi kết quả của tsc sẽ giống như sau:

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

Tuy nhiên, tôi dường như không types.d.tsthể được sao chép vào thư mục xây dựng của mình.

Bản ghi chép không cung cấp bất kỳ cơ chế nào để sao chép .d.tstệp? Hay tôi chỉ định cấu hình sai ở đâu đó? (Tôi đã thử rất nhiều cấu hình khác nhau tại thời điểm này; dường như không có gì hoạt động)

Trả lời

25 ford04 Jun 04 2019 at 08:43

Bạn đúng - declaration:truengụ ý rằng chỉ đối với mỗi .tstệp nhất định mới tsctạo và sao chép .d.tstệp đầu ra tương ứng vào buildthư mục (ngoài .js.mapnếu có). Vì vậy, tscsẽ không sao chép types.d.tstệp tùy chỉnh của bạn vào thư mục đầu ra.

Về cơ bản, .d.tscác tệp được coi là đầu vào không thể chạm tới để trình biên dịch thực hiện kiểm tra kiểu. Chúng không được sử dụng cho bất kỳ quá trình tạo đầu ra nào, điều đó cũng có nghĩa là chúng không bị sao chép sang build. Bạn có thể đọc thêmhttps://github.com/Microsoft/TypeScript/issues/5112 về quan điểm của người bảo trì:

Các tệp .d.ts bạn sử dụng là đầu vào cho hệ thống xây dựng nhưng không phải là đầu ra. Hoàn toàn hợp lý khi sử dụng một số loại từ .d.ts nhưng đầu ra của bạn không sử dụng các loại đó, vì vậy không có lý do gì để phân phối .d.ts đầu vào với kết quả xây dựng của bạn. [...] Có vẻ như bạn sẽ muốn có một bước sau xây dựng trong công cụ xây dựng của mình để sao chép các tệp .d.ts có liên quan ở bất cứ đâu bạn cần.

Các tệp .d.ts được coi là "tham chiếu" mà trình biên dịch sẽ không chạm vào chúng, không di chuyển chúng hoặc tạo lại chúng. Một cách dễ dàng để nghĩ về các tệp .d.ts là chúng đi cùng với các tệp .js của bạn. nếu bạn đang sao chép tệp .js, bạn nên sao chép tệp .d.ts phù hợp.

Giải pháp # 1: Sao chép tệp d.ts qua bước xây dựng thủ công

Một giải pháp khả thi là sao chép tất cả .d.tscác tệp cần thiết như types.d.tsthủ công trong bước xây dựng. Công cụ cụ thể là sở thích và phụ thuộc vào dự án và loại xây dựng của bạn, hệ điều hành trong số những người khác. Công cụ này nên bảo toàn cấu trúc thư mục trong srckhi sao chép tệp vào build, để các importtham chiếu kiểu vẫn hoạt động. Đến tên một vài:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(vỏ), rsync, robocopyhoặc một nền tảng độc lập gói NPM nhưhttps://www.npmjs.com/package/copyfiles:

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

Giải pháp # 2: Ghi lại tệp d.ts thành phần mở rộng .ts

Ghi lại các .d.tstệp của bạn thành .tsphần mở rộng (hoặc tích hợp lại các loại vào .tscác tệp hiện có ), do đó, hãy tscquan tâm đến việc tạo ra các khai báo trong đầu ra. Hơi bất lợi: Bạn không có trình biên dịch nào được thực thi phân tách giữa các loại và mã thực thi ( d.tscác tệp không được phép chứa mã). Lợi thế lớn là, bạn không cần thêm một bước xây dựng.

Theo ý kiến ​​của tôi, cách sau là cách tiếp cận dễ nhất để tạo một API công khai, ví dụ: cho gói npm của bạn, trong khi một .d.tstệp có thể tạo ứng cử viên cho khai báo loại được sử dụng nội bộ và chia sẻ.

Hy vọng, điều đó sẽ giúp.