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

mpe*_*pen 15 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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

 import Napi from '@org/napi-js';
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

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';
Run Code Online (Sandbox Code Playgroud)

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

{
    "compilerOptions": {
        ...
        "baseUrl": "./",
        "paths": {
            "*": ["types/*"]
        }
    },
    ...
Run Code Online (Sandbox Code Playgroud)

但这没有任何帮助。

我应该做些什么?或者,更明确地说:

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

我想,我希望把所有这些存根types/,和我的来源src/,除非有举办TS项目的一些标准方式。

Bry*_*sen 15

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

// @ts-ignore
import Napi from '@org/napi-js';
Run Code Online (Sandbox Code Playgroud)


mpe*_*pen 11

好的,经过大量的反复试验,结果证明 TypeScript在想要一个名为 的模块上撒谎org__napi-js,而它真正想要的是@org/napi-js.

而且,如果您paths像我一样不熟悉如何工作,TypeScript 会根据模块名称根据需要查找文件,因此路径必须匹配,并且包括@org目录。

所以,我通过更新我的tsconfig.json

{
    "compilerOptions": {
        ...
        "baseUrl": ".",
        "paths": {
            "*": ["types/*"]
        }
    },
Run Code Online (Sandbox Code Playgroud)

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

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

declare module '@org/napi-js';
Run Code Online (Sandbox Code Playgroud)

请注意它如何包含@namespace/.

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