如何正确地“声明”模块? (TS7016)

时间:2018-08-01 17:09:52

标签: typescript

首先,这是我的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(如果存在)或添加一个包含声明模块'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的最少代码量是多少?

除非有某种标准的方式来组织TS项目,否则我想将所有这些存根都放在types/中,而我的消息源都放在src/中。

2 个答案:

答案 0 :(得分:4)

好的,因此,通过大量的反复试验,事实证明TypeScript是在撒谎关于想要一个名为org__napi-js的模块,而真的想要的是@org/napi-js

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

因此,通过更新tsconfig.json使我走上了正轨:

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

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

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

declare module '@org/napi-js';

请注意 如何包含@namespace/

就是这样。您的项目应立即编译。

答案 1 :(得分:0)

创建空声明的另一种方法是ts-ignore:

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