如何使用我自己的声明文件解决 "Could not find a declaration file for module" 错误?

How to solve the "Could not find a declaration file for module" error using my own declaration file?

我有一个测试项目,我正在其中测试类型定义文件。该项目有一个名为 index.ts 的文件,如下所示:

import i18nFu = require("gettext.js");

gettext.js 软件包是使用 Node.js 安装的,如下所示:npm install gettext.js

VS Code 显示以上行的以下错误消息:

Could not find a declaration file for module 'gettext.js'.

'SOME_PATH/gettext.js' implicitly has an 'any' type.

Try 'npm install @types/gettext.js' if it exists or add a new declaration (.d.ts) file containing "declare module 'gettext.js';"

安装 @types/gettext.js 模块确实解决了这个问题。但我很好奇,所以我没有就此止步。我再次删除了 @types/gettext.js 模块并尝试自己创建声明文件。

我在我的项目文件夹中创建了一个名为 types/gettext.js 的子文件夹,并将旧 node_modules/@types/gettext.js 文件夹的内容复制到其中。我还在我的 tsconfig.json 文件中添加了一个 typeRoots 条目,所以它看起来像这样:

{
    "compilerOptions": {
        "lib": ["ES2017"],
        "module": "commonjs",
        "strict": true,
        "target": "es5",
        "typeRoots": ["./types", "./node_modules/@types"],
    },
    "files": ["test.ts"]
}

但错误信息不会消失。将 types/gettext.js/index.d.ts 文件 (which you can see here) 的内容替换为 declare module 'gettext.js'(如错误消息所建议的那样)确实会消除错误。但这不是拥有类型的解决方案。我错过了什么?

PS: 我对解决黑客解决方案不感兴趣,例如使用 ts-ignore 或将 noImplicitAny 设置为 false.

我通过设置 baseUrl 编译器选项解决了这个问题。有趣的是,我现在根本不需要 typeRoots 选项来编译和 运行 成功。这是新的 tsconfig.json 文件:

{
    "compilerOptions": {
        "lib": ["ES2017"],
        "module": "commonjs",
        "strict": true,
        "target": "es5",
        "baseUrl": "./types"
    },
    "files": ["tests.ts"]
}

我希望这可以帮助 运行遇到同样问题的人。