【问题标题】:how does the typescript compiler discover npm packages with types?typescript 编译器如何发现带有类型的 npm 包?
【发布时间】:2019-07-25 15:40:16
【问题描述】:

可以通过tsconfig.json 配置打字稿编译器。这也提供了带有typeRoots 键的settings for discovering type definition files

默认情况下:

默认情况下,所有可见的“@types”包都包含在您的 汇编。任何封闭文件夹的 node_modules/@types 中的包 被认为是可见的;具体来说,这意味着包内 ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/,等等。

如果指定了 typeRoots,那么只有 typeRoots 下的包会被 包括

许多包在单独的@types/<package-name> 包中提供其类型定义。 Jquery 例如。 同时,有些包附带了捆绑的类型定义,Firebase 就是这样做的。

为什么 typescript 编译器可以在不编辑 typeRoots 设置的情况下选择 Firebase 定义?这些定义不在@types 中,据我所知,默认情况下不应使用。

【问题讨论】:

    标签: typescript npm typescript-definitions


    【解决方案1】:

    在 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

    Typescripts 会读取您正在编译的代码中引用的所有已安装包的 "typings" 中的那些引用文件。

    typeRoots 和普通的import 'firebase' 之间的区别是:

    1. 在 typeRoot 中提供类型文件后,这些类型将始终在编译过程中使用(自动包含)。这对于更改全局上下文的库来说非常有用,例如 jQuery、node 等。它们提供了无法轻松获取的全局函数。

    2. 您可以通过说 import {Foo} from 'bar' 来明确导入它。如果 bar 包的 package.json 中有 typing 属性,Typescript 会在 typeRoots 中额外提取它。

    documentation 是这样说的:

    请记住,仅当您使用具有全局声明的文件(而不是声明为模块的文件)时,自动包含才重要。例如,如果您使用 import "foo" 语句,TypeScript 可能仍会通过 node_modules 和 node_modules/@types 文件夹查找 foo 包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-21
      • 2018-01-23
      • 2021-12-15
      • 1970-01-01
      • 2016-09-29
      • 2018-01-07
      • 2022-11-21
      • 2019-07-26
      相关资源
      最近更新 更多