typescript - typescript 编译器如何发现带有类型的 npm 包?
问题描述
typescript 编译器可以通过tsconfig.json
. 这还提供了用于使用密钥发现类型定义文件的设置。typeRoots
默认:
默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/ 等中的包。
如果指定了 typeRoots,则只包含 typeRoots 下的包
许多包在单独的@types/<package-name>
包中提供它们的类型定义。以jQuery为例。同时,有些包附带了捆绑的类型定义,Firebase就是这样做的。
为什么打字稿编译器可以在不编辑设置的情况下选择 Firebase 定义typeRoots
?这些定义不在@types 中,据我所知,默认情况下不应选择。
解决方案
在 TypeScript 的发布文档中,您会看到有两种方法可以为您的用户提供类型:https ://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html
- 与你的 npm 包捆绑在一起,或者
- 在 npm 上发布到 @types 组织。
像 Firebase 这样更大的库有自己的类型,请参阅 packages/firebase/package.json#L58或packages/database/package.json#L68。
Typescripts 从"typings"
正在编译的代码中引用的所有已安装包中读取这些引用的文件。
typeRoots
和正则的区别import 'firebase'
是:
在 typeRoot 中提供类型文件后,这些类型将始终在编译过程中使用(自动包含)。这对于更改全局上下文的库来说非常有用,例如 jQuery、node 等。它们提供了无法轻松获取的全局函数。
你通过说明确地导入它
import {Foo} from 'bar'
。如果bar
包在它的 package.json 中有一个typing
属性,Typescript 会在 typeRoots 中额外拾取它。
文档是这样说的:
请记住,仅当您使用具有全局声明的文件(而不是声明为模块的文件)时,自动包含才重要。例如,如果您使用 import "foo" 语句,TypeScript 可能仍会通过 node_modules 和 node_modules/@types 文件夹查找 foo 包。
推荐阅读
- c - c中的scanf语句和指针
- android - 尝试连接 MQTT 时机器不在网络上?
- flutter - 如果列表不为空,则颤动上下文变为空
- mongodb - 带有分页的猫鼬查询无法正常工作
- sql - 在 Oracle 中创建带间隔的时间维度表
- docker - SocketIO (docker 副本) + Nginx + Browser = 副本总数的重复发出事件
- php - 抽象工厂类返回接口类型,找不到方法?
- php - Laravel-file_put_contents()-打开流失败,权限被拒绝
- java - Java如何将0作为分母显示在有理类中
- php - 如何在php中运行节点模块并显示输出?