我正在编写一个nodeJS 服务,它使用一堆没有@types 的npm 模块。
tsc 错误消息告诉我我需要添加 index.d.ts 文件,但它没有告诉我将它放在哪里。我的 helper.spec.ts 文件也导入了相同的模块,当使用 jest 运行时也无法检测到 index.d.ts
我将该文件与 tsconfig.json 一起放在我的根目录中,但它没有检测到它。我的文件和结构如下所示:
文件夹结构
node_modules
build
app.js
helper.js
another.js
spec
- helper.spec.ts
- another.spec.ts
src
- app.ts
- helper.ts
- another.ts
tsconfig.json
index.d.ts
jest.config.json
package.json
package-lock.json
tsconfig.json
{
"compilerOptions": {
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"allowJs": true, /* Allow javascript files to be compiled. */
"outDir": "build", /* Redirect output structure to the directory. */
"strict": true, /* Enable all strict type-checking options. */
},
"include": [
"src/**/*.ts",
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
}
索引.d.ts
declare module "module-one";
declare module "module-two";
declare module "module-three";
包.json
{
"dependencies": {
"module-one": "^2.0.4",
"module-two": "^1.3.3",
"module-three": "0.0.3",
"@types/lodash": "^4.14.129",
},
"devDependencies": {
"@types/jest": "^24.0.13",
"@types/node": "^9.6.0",
"cpx": "^1.5.0",
"jest": "^24.8.0",
"ts-jest": "^24.0.2",
"typescript": "^3.4.5"
},
"scripts": {
"start": "cd build && node app.js",
"test": "jest",
"build": "tsc",
"postinstall": "npm run-script build"
},
}
tsc 和 jest 期望 index.d.ts 在哪里?
一些文章建议为每个模块创建一个 index.d.ts,例如./types/module-one/index.d.ts
, ./types/module-two/index.d.ts
,./types/module-three/index.d.ts
然后编辑 tsconfig.jsoncompilerOptions.typeRoots
以包含./types
文件夹。
但我只想有 1 个 index.d.ts 和所有声明。
当我编辑 tsconfig.jsoninclude
以包含index.d.ts
文件时,我发现 tsc 可以编译我的 src 文件夹中的文件。但是,当我运行 jest 时,它仍然抱怨我的模块 index.d.ts 丢失了。
编辑: 如果我删除了我的 tsconfig.json,那么 jest 将正确运行而不会抱怨缺少模块,但是我无法 tsc 构建我的 src 文件。
如果我保留 tsconfig.json,那么 tsc 将构建我的 src 文件,但 jest 会抱怨 module-one 未定义。
编辑2:
我发现如果我设置[jest.config.ts].globals.ts-jest.diagnostics = false
了,那么错误就会消失并且我的所有测试都通过了!但我不认为这是正确的解决办法?