如何让 Typescript 获取声明文件?

Posted

技术标签:

【中文标题】如何让 Typescript 获取声明文件?【英文标题】:How do I make Typescript pick up a declaration file? 【发布时间】:2019-04-18 19:56:19 【问题描述】:

我的文件 src/auth/ManagementAPI.ts 使用 Auth0。我需要使用自己的声明文件并创建了src/@types/auth0.d.ts

但是,当我运行 ts-node 时,我收到了这个错误:

TSError: ⨯ Unable to compile TypeScript:
auth/ManagementAPI.ts(1,69): error TS7016: Could not find a declaration file for module 'auth0'. '/Users/danrumney/WebstormProjects/ohana/node_modules/auth0/src/index.js' implicitly has an 'any' type.
  Try `npm install @types/auth0` if it exists or add a new declaration (.d.ts) file containing `declare module 'auth0';

我已更新我的 tsconfig.json 文件以包括:

"typeRoots": [
    "./node_modules/@types",
    "./src/@types"
]

我的声明文件是这样的:

declare module 'auth0' 
  /*...*/

为什么没有收到这份声明?

我在这里创建了一个示例存储库:https://bitbucket.org/ohanapediatrics/so-demo/src/master/

【问题讨论】:

您有示例 repo 还是可以在 stackblitz 上创建示例? 您的 auth0 声明文件名是 auth0.d.ts 在您的 ./src/@types 目录中吗?好的做法是将您的第三方库本地声明文件放在./types 目录中。您甚至不必在配置中添加它,它会自动解析。 更新:错误是当我使用ts-node,而不是tsc 添加了 git repo:bitbucket.org/ohanapediatrics/so-demo/src/master 【参考方案1】:

对于加载声明文件的typeRoots 机制,需要将其命名为index.d.ts 并放置在typeRoots 选项中列出的目录之一的子目录 中;见documentation。根据您存储库中的typeRoots 设置,您可以将文件放在src/types/auth0/index.d.ts

上述方法可行,但由于您的声明文件正在声明一个模块,因此最好设置模块解析来查找您的声明文件,而不是使用主要用于全局声明的typeRoots。为此,请使用baseUrl and paths 或为名为@9​​87654332@ 的本地npm 包创建一个package.json 文件,并使用相对路径在您的主package.json 文件中注册该包。

【讨论】:

谢谢!从文档中:> 类型包是一个文件夹,其中包含一个名为 index.d.ts 的文件,或者一个包含 package.json 且具有 types 字段的文件夹。

以上是关于如何让 Typescript 获取声明文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何导入其他 TypeScript 文件?

使用 TypeScript 在节点应用程序中导入 JSON 文件

如何在解析模块时阻止 typescript 2.0 遍历所有父目录?

在 TypeScript 中使用 import/require 来获取接口声明

如何在打字稿中正确导入自定义类型

如何编写 Typescript 声明文件