簡體   English   中英

打字稿編譯器如何發現帶有類型的npm軟件包?

[英]how does the typescript compiler discover npm packages with types?

可以通過tsconfig.json配置打字稿編譯器。 這還提供了用於使用typeRoots發現類型定義文件typeRoots

默認:

默認情況下,所有可見的“ @types”包均包含在您的編譯中。 任何封閉文件夾的node_modules / @ types中的軟件包都被視為可見; 特別是,這表示在./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/等內的軟件包。

如果指定了typeRoots,則僅包含typeRoots下的軟件包

許多軟件包在單獨的@types/<package-name>軟件包中提供其類型定義。 以Jquery為例。 同時,有些軟件包附帶捆綁的類型定義, Firebase會這樣做

為什么打字稿編譯器可以在不編輯typeRoots設置的情況下選擇Firebase定義? 這些定義不在@types中,據我所知,默認情況下不應該使用這些定義。

在TypeScript的發布文檔中,您可以看到兩種為用戶提供類型的方法: https : //www.typescriptlang.org/docs/handbook/declaration-files/publishing.html

  1. 與您的npm軟件包捆綁在一起,或者
  2. 在npm上發布到@types組織。

諸如Firebase之類的較大庫具有其自己的類型,請參閱packages / firebase / package.json#L58packages / database / package.json#L68

打字稿讀取正在編譯的代碼中引用的所有已安裝軟件包的"typings"的那些引用文件。

typeRoots和常規import 'firebase' typeRoots ”之間的區別是:

  1. 在typeRoot中提供類型文件后,這些類型將始終在編譯過程中使用(自動包含)。 這對於更改全局上下文(如jQuery,node等)的庫非常有用。它們提供了否則不易獲取的全局函數。

  2. 您可以通過說出import {Foo} from 'bar'明確地導入它。 如果bar封裝具有typing在其物業的package.json,打字稿將它撿起來還對那些在typeRoots。

文件說:

請記住,僅當您使用帶有全局聲明的文件(而不是聲明為模塊的文件)時,自動包含才重要。 例如,如果使用import“ foo”語句,TypeScript可能仍會遍歷node_modules和node_modules / @ types文件夾來查找foo包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM