我有一个测试项目,我在其中测试类型定义文件。该项目有一个名为的文件index.ts,如下所示:
import i18nFu = require("gettext.js");
Run Code Online (Sandbox Code Playgroud)
该gettext.js包是如何使用Node.js这样的安装:npm install gettext.js
VS Code 为上面的行显示以下错误消息:
找不到模块“gettext.js”的声明文件。
'SOME_PATH/gettext.js' 隐式具有 'any' 类型。
尝试'npm install @types/gettext.js'(如果它存在)或添加一个包含“declare module 'gettext.js';”的新声明(.d.ts)文件
安装@types/gettext.js模块确实可以解决问题。但我很好奇,所以我并没有就此止步。我@types/gettext.js再次删除了模块并尝试自己创建声明文件。
我types/gettext.js在我的项目文件夹中创建了一个子文件夹,并将旧node_modules/@types/gettext.js文件夹的内容复制到其中。我还在typeRoots我的tsconfig.json文件中添加了一个条目,所以它看起来像这样:
{
"compilerOptions": {
"lib": ["ES2017"],
"module": "commonjs",
"strict": true,
"target": "es5",
"typeRoots": ["./types", "./node_modules/@types"],
},
"files": ["test.ts"]
}
Run Code Online (Sandbox Code Playgroud)
但错误信息不会消失。用(如错误消息所建议的)替换types/gettext.js/index.d.ts文件的内容(您可以在此处看到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"]
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助遇到同样问题的人。