在 typescript 项目中,源文件和测试文件可以共享目录并使用不同的 tsconfig.json,同时可以被 VS code 理解吗?

问题描述 投票:0回答:1

我写这个问题是为了回答它;这是我多年来一直在努力的事情。这是目录结构:

root/
  tsconfig.json
  ts/
    index.ts
    index.spec.ts

我想要规范文件和生产代码的单独 tsconfig.json 设置。例如,我想要

"noImplicitAny": true
作为我的生产代码,
"noImplicitAny": false
作为我的测试代码。

我还希望 Visual Studio Code 与

tsc
eslint
等同步。换句话说,如果 Visual Studio Code 报告错误,我希望我的构建过程报告相同的错误,反之亦然。

尽管我已经找到了 90% 成功的解决方案,但我还没有找到 完全 有效的解决方案。通常,VSCode 报告的错误实际上并不存在。

我如何满足所有这些要求?

typescript visual-studio-code tsconfig
1个回答
0
投票

“技巧”是使用项目参考。尽管链接的文档准确地说明了这一点并且并未完全隐藏,但它缺少一些重要的示例配置。它也是在您想要单独的测试和源目录的假设下编写的,但这里的情况并非如此。

两个新的 tsconfig 添加到项目的根目录中:

root/
  tsconfig.src.json # new
  tsconfig.spec.json  # new
  tsconfig.json
  ts/
    index.ts
    index.spec.ts

这是根

tsconfig.json
。 Visual Studio Code 仅读取具有此名称的
tsconfig.json
文件,因此它必须充当一种基本配置:

{
    "compilerOptions": {
        "incremental": true,
        "target": "es2020",
        "module": "es2020",
        "isolatedModules": true,
        "forceConsistentCasingInFileNames": true
    },
    "references": [
        { "path": "tsconfig.spec.json" },
        { "path": "tsconfig.src.json" }
    ],
    "exclude": ["."] // by default tsconfig, includes most files. This prevent that.
}

tsconfig.src.json

{
    "compilerOptions": {
        "composite": true,
        "outDir": "dist",
        "rootDir": "src",
        "noImplicitAny": true // note this
    },
    "exclude": [ "src/**/*.spec.ts" ],
    "extends": "./tsconfig.json",
    "include": [ "src" ]
}

tsconfig.spec.json

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "esModuleInterop": true,
        "isolatedModules": false,
        "moduleResolution": "node",
        "types": ["jest"],
        "noImplicitAny": false, // note this
    },
    "exclude": [],
    "extends": "./tsconfig.json",
    "include": [ "src/**/*.spec.ts"]
}

索引.ts

function fn(s) { // Error: Parameter 's' implicitly has an 'any' type.
  console.log(s.subtr(3));
}
fn(42);

索引.规格.ts

export {};

test("should not parse simple strings", () => {
  function fn(s) { // NO ERROR: Parameter 's' implicitly has an 'any' type.
    console.log(s.subtr(3));
  }
  fn(42);

  expect(true).not.toBe(false);
});

© www.soinside.com 2019 - 2024. All rights reserved.