测试 tsconfig,添加路径时丢失自动完成和输入
Test tsconfig, losing autocompletion and typing when adding paths
我想要单独的 test 和 src 文件夹,我遵循了 this article to get this kind of setup. 目前我遇到了以下问题。如果我不向我的 tests/tsconfig 添加 paths
选项,我将收到以下错误
Error: Cannot find module '@/models/Posts/Post'
Require stack
这意味着即使它们在 IDE 中工作,我的路径也没有解析,并且正在为我提供自动完成和输入以及我需要的一切。现在,当我将路径条目添加到配置时,测试 运行 没有任何错误,但在 IDE 中我得到了他们找不到的错误 @/models/Posts/Post
。这意味着 IDE 现在无法解析路径
这是一个非常糟糕的情况,因为我要么无法获得自动完成和编辑器的任何帮助,要么我在测试中崩溃。不知道该怎么做
这是我的设置
用于构建实际项目的根 tsconfig
{
"compilerOptions": {
"target": "es2017",
"lib": [
"es2017",
"esnext.asynciterable"
],
"typeRoots": [
"./node_modules/@types",
"./src/types"
],
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"module": "commonjs",
"pretty": true,
"sourceMap": true,
"outDir": "./dist",
"allowJs": true,
"noEmit": false,
"esModuleInterop": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
},
"include": [
"./src/**/*"
],
"exclude": [
"node_modules",
"tests"
]
}
这是我的测试目录中的 tsconfig
{
"extends": "../tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"experimentalDecorators": true,
"strictPropertyInitialization": false,
"isolatedModules": false,
"strict": false,
"noImplicitAny": false,
"paths": {
"@/*": ["../src/*"]
}
},
"exclude": ["../node_modules", "*.js"],
"include": ["./**/*.ts", "../src/**/*"]
}
项目结构为
根
| - src(ts 文件)
| - dist(编译后的 js)
| - 测试
正如文章提到的,我使用 regsiter.js
/* eslint-disable @typescript-eslint/no-var-requires */
const tsNode = require("ts-node");
const tsConfigPaths = require("tsconfig-paths");
const mainTSConfig = require("./tsconfig.json");
const testTSConfig = require("./tests/tsconfig.json");
tsConfigPaths.register({
baseUrl: "./tests",
paths: {
...mainTSConfig.compilerOptions.paths,
...testTSConfig.compilerOptions.paths,
},
});
tsNode.register({
files: true,
transpileOnly: true,
project: "./tests/tsconfig.json",
});
与.mocharc.json
{
"require": "./register.js",
"reporter": "dot"
}
并且 运行使用我的测试
"test": "nyc ./node_modules/.bin/_mocha 'tests/**/*.test.ts'"
简答:
将 "baseUrl": "."
添加到您的 tests/tsconfig.json
。
解释:
tests/tsconfig.json
从主 tsconfig.json
文件继承了 baseUrl
(但仍然相对于该文件解析它)。
这意味着 tests/tsconfig.json
中的 baseUrl
实际上是 ".."
.
提示:您可以使用 TypeScript 编译器来显示 tsconfig 文件的所有继承值和其他派生值:tsc -p tests/tsconfig.json --showConfig
paths
相对于 baseUrl
解析。
并且由于您在 register.js
中明确指定 baseUrl
,您需要确保不同的 baseUrl
指向同一目录(此处为 tests
),以便路径可以一致在运行时由 IDE 和 tsconfig-paths
解决。
我想要单独的 test 和 src 文件夹,我遵循了 this article to get this kind of setup. 目前我遇到了以下问题。如果我不向我的 tests/tsconfig 添加 paths
选项,我将收到以下错误
Error: Cannot find module '@/models/Posts/Post'
Require stack
这意味着即使它们在 IDE 中工作,我的路径也没有解析,并且正在为我提供自动完成和输入以及我需要的一切。现在,当我将路径条目添加到配置时,测试 运行 没有任何错误,但在 IDE 中我得到了他们找不到的错误 @/models/Posts/Post
。这意味着 IDE 现在无法解析路径
这是一个非常糟糕的情况,因为我要么无法获得自动完成和编辑器的任何帮助,要么我在测试中崩溃。不知道该怎么做
这是我的设置
用于构建实际项目的根 tsconfig
{
"compilerOptions": {
"target": "es2017",
"lib": [
"es2017",
"esnext.asynciterable"
],
"typeRoots": [
"./node_modules/@types",
"./src/types"
],
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"module": "commonjs",
"pretty": true,
"sourceMap": true,
"outDir": "./dist",
"allowJs": true,
"noEmit": false,
"esModuleInterop": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
},
"include": [
"./src/**/*"
],
"exclude": [
"node_modules",
"tests"
]
}
这是我的测试目录中的 tsconfig
{
"extends": "../tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"experimentalDecorators": true,
"strictPropertyInitialization": false,
"isolatedModules": false,
"strict": false,
"noImplicitAny": false,
"paths": {
"@/*": ["../src/*"]
}
},
"exclude": ["../node_modules", "*.js"],
"include": ["./**/*.ts", "../src/**/*"]
}
项目结构为
根
| - src(ts 文件)
| - dist(编译后的 js)
| - 测试
正如文章提到的,我使用 regsiter.js
/* eslint-disable @typescript-eslint/no-var-requires */
const tsNode = require("ts-node");
const tsConfigPaths = require("tsconfig-paths");
const mainTSConfig = require("./tsconfig.json");
const testTSConfig = require("./tests/tsconfig.json");
tsConfigPaths.register({
baseUrl: "./tests",
paths: {
...mainTSConfig.compilerOptions.paths,
...testTSConfig.compilerOptions.paths,
},
});
tsNode.register({
files: true,
transpileOnly: true,
project: "./tests/tsconfig.json",
});
与.mocharc.json
{
"require": "./register.js",
"reporter": "dot"
}
并且 运行使用我的测试
"test": "nyc ./node_modules/.bin/_mocha 'tests/**/*.test.ts'"
简答:
将 "baseUrl": "."
添加到您的 tests/tsconfig.json
。
解释:
tests/tsconfig.json
从主 tsconfig.json
文件继承了 baseUrl
(但仍然相对于该文件解析它)。
这意味着 tests/tsconfig.json
中的 baseUrl
实际上是 ".."
.
提示:您可以使用 TypeScript 编译器来显示 tsconfig 文件的所有继承值和其他派生值:tsc -p tests/tsconfig.json --showConfig
paths
相对于 baseUrl
解析。
并且由于您在 register.js
中明确指定 baseUrl
,您需要确保不同的 baseUrl
指向同一目录(此处为 tests
),以便路径可以一致在运行时由 IDE 和 tsconfig-paths
解决。