【问题标题】:How to properly "declare" a module? (TS7016)如何正确“声明”一个模块? (TS7016)
【发布时间】:2018-08-01 17:09:51
【问题描述】:

首先,这是我的tsconfig.json

{
    "compilerOptions": {
        "strict": true,
        "importHelpers": false,
        "inlineSources": true,
        "noEmitOnError": true,
        "pretty": true,
        "module": "commonjs",
        "noImplicitAny": true,
        "suppressImplicitAnyIndexErrors": false,
        "removeComments": true,
        "preserveConstEnums": false,
        "sourceMap": true,
        "lib": ["es2017","esnext.asynciterable"],
        "skipLibCheck": true,
        "outDir": "dist",
        "target": "es2018",
        "declaration": true,
        "types" : ["node"],
        "resolveJsonModule": true,
        "esModuleInterop": false
    },
    "files": [
        "src/DatabaseWrapper"
    ],
    "exclude": [
        "node_modules"
    ]
}

现在我尝试导入一个 JavaScript 库:

 import Napi from '@org/napi-js';

我得到这个错误:

TS7016:找不到模块“napi-js”的声明文件。 '/home/mpen/Projects/my-project/node_modules/@org/napi-js/dist/index.js' 隐含了一个 'any' 类型。 尝试npm install @types/org__napi-js(如果存在)或添加一个包含 `declare module 'org__napi-js' 的新声明 (.d.ts) 文件;

@types/org__napi-js 不存在,所以不好。那么如何正确申报呢?

我尝试创建一个文件,types/org__napi-js.d.ts',里面只有这个:

declare module 'org__napi-js';

然后我尝试更新我的tsconfig.json 以便它可以找到它:

{
    "compilerOptions": {
        ...
        "baseUrl": "./",
        "paths": {
            "*": ["types/*"]
        }
    },
    ...

但这没有任何帮助。

我该怎么办?或者,更明确地说:

  1. 如何告诉 TypeScript 在哪里可以找到我的模块?
  2. 在这个模块中最少需要多少代码才能说默认导出是any

我想我想将所有这些存根放在types/ 中,并将我的源代码放在src/ 中,除非有一些标准的方式来组织一个 TS 项目。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    创建空声明的替代方法是 ts-ignore:

    // @ts-ignore
    import Napi from '@org/napi-js';
    

    【讨论】:

      【解决方案2】:

      好的,所以通过大量的试验和错误,事实证明 TypeScript 在撒谎关于想要一个名为 org__napi-js 的模块,它真正想要的是 @987654325 @。

      而且,如果您不熟悉 paths 的工作原理,TypeScript 会根据模块名称根据需要查找文件,因此路径必须匹配,其中包括@org 目录。

      所以,通过更新我的tsconfig.json,我走上了正确的道路:

      {
          "compilerOptions": {
              ...
              "baseUrl": ".",
              "paths": {
                  "*": ["types/*"]
              }
          },
      

      也就是说,在 types 目录中查找模块。

      然后创建模块文件types/@org/napi-js.d.ts。它只需要:

      declare module '@org/napi-js';
      

      注意它是如何包含@namespace/的。

      就是这样。您的项目现在应该可以编译了。

      【讨论】:

      • > 原来 TypeScript 是在撒谎关于想要一个名为 org__napi-js 的模块想要file an issue 还是应该?
      • @MattMcCutchen 实际上我只是在输入一个,但后来我发现有人已经创建了它:github.com/Microsoft/TypeScript/issues/23999 感谢您提供!
      • @mpen,你用的是哪个版本的TS?
      • @mpen,您是如何得出必须将paths 添加到tsconfig.json 文件的结论的?我的印象是你应该使用typeRoots
      • @hendrikswan 我在某处读到typeRoots 是旧的做法,而paths 是新的热门事物。 AFAICT,typeRoots 意味着 TS 将尝试在这些目录中加载 everything,而 paths 更具体一点,所以我想它是首选?没有把握。这里只是一个菜鸟。编辑:ts-nodesayspaths 用于“模块定义”,typeRoots 用于全局定义。
      【解决方案3】:

      我在使用 @google-cloud/some-lib 时遇到了类似的问题,并且无法按照上面解释的方式工作。

      我最终在我的 src 目录中找到了一个文件,其中包含“declare module '@google-cloud/some-lib';”并且没有特定的配置,例如没有路径或 basePath 配置。文件名无关紧要,只要以 .d.ts 结尾即可。

      使用 Typescript 3.0.3 和 2.4.2 测试

      花了我半天时间来修复。谢谢打字稿:)

      【讨论】:

        猜你喜欢
        • 2021-07-24
        • 2019-10-22
        • 2019-01-09
        • 1970-01-01
        • 2020-03-30
        • 1970-01-01
        • 2011-04-28
        • 1970-01-01
        • 2012-06-18
        相关资源
        最近更新 更多