我写这个问题是为了回答它;这是我多年来一直在努力的事情。这是目录结构:
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 报告的错误实际上并不存在。
我如何满足所有这些要求?
“技巧”是使用项目参考。尽管链接的文档准确地说明了这一点并且并未完全隐藏,但它缺少一些重要的示例配置。它也是在您想要单独的测试和源目录的假设下编写的,但这里的情况并非如此。
两个新的 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"]
}
function fn(s) { // Error: Parameter 's' implicitly has an 'any' type.
console.log(s.subtr(3));
}
fn(42);
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);
});