测试 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 解决。