我正在编写一个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"
]
}
index.d.ts
declare module "module-one";
declare module "module-two";
declare module "module-three";
package.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.json compilerOptions.typeRoots
以包含./types
文件夹。
但是我只想拥有所有声明的1个index.d.ts。
当我编辑tsconfig.json include
以包含index.d.ts
文件时,我发现tsc可以编译src文件夹中的文件。但是,当我开玩笑时,它仍然抱怨我的模块index.d.ts丢失了。
编辑: 如果我删除tsconfig.json,那么玩笑将正确运行,而不会抱怨缺少模块,但是我无法tsc构建我的src文件。
如果我保留tsconfig.json,则tsc将构建我的src文件,但开玩笑会抱怨模块一未定义。
编辑2:
我发现,如果我设置了[jest.config.ts].globals.ts-jest.diagnostics = false
,那么错误就消失了,我所有的测试都通过了!但是我认为这不是正确的解决方法吗?
答案 0 :(得分:3)
TLDR:由于某些正常人无法理解的原因,TypeScript 在 baseUrl 编译器选项指向的目录中查找 index.d.ts!
愚蠢但正确的答案是“你要把你的 index.d.ts 放在你的转译器会找到它的地方”
好吧,不是那么愚蠢。请记住,复制粘贴一个工作项目的一半配置和其他项目的一半配置很可能会给您提供非工作配置。
根据this article,我已添加到我的 tsconfig.json
{
"compilerOptions": {
"typeRoots": [ "./types", "./node_modules/@types"],
...
},
...
}
糟糕,什么都没发生。
很可能是因为“此外,本文假设您使用的是 TypeScript 2.x。” - 我使用的是 3.x。
愚蠢的复制粘贴永远无法正常工作。
使用 truss(FreeBSD 的 strace 对应物),我发现转译器完全忽略了我的 typeRoots。它在 /node_modules/@types/vue-native-notification/index.d.ts 中搜索我的 index.d.ts - 在我的 src 目录中,在我的项目目录中,在 home 中直到 /node_modules/@types/ vue-native-notification/index.d.ts
好的,将我的 src/types/vue-native-notification 符号链接到 node_modules/@types/vue-native-notification 可以解决问题,但这不是我想要的。我不想根据转译器的默认首选项修补我的树!
根据official docs,typesRoot 选项被重命名为types。非常微软。
好的,我已将 typesRoot 更改为 types。
现在我无法跟踪读取 src/types/vue-native-notification/index.d.ts 的转译器......并抛出同样的错误!
我在 index.d.ts 中写了一些词,发现它没有被编译。确实很奇怪。
没有一丝希望,我尝试了 setting a baseUrl 看似毫无意义的想法,但它有所帮助。删除类型编译器选项并没有改变任何事情。
我对成功完全不满意,它看起来很神奇。但它有效。