为啥 TypeScript 编译器会忽略 tsconfig.json?

Posted

技术标签:

【中文标题】为啥 TypeScript 编译器会忽略 tsconfig.json?【英文标题】:Why is the TypeScript compiler ignoring tsconfig.json?为什么 TypeScript 编译器会忽略 tsconfig.json? 【发布时间】:2017-01-16 20:46:39 【问题描述】:

我有这个文件,是从教程中粘贴过来的(让我们面对现实吧,文档、tuts 和示例之间的差异令人震惊):

/scripts/tsconfig.json:


    "compilerOptions": 
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "module": "commonjs",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "outDir": "../wwwroot/appScripts/",
        "removeComments": false,
        "sourceMap": true,
        "target": "es5",
        "moduleResolution": "node"
    ,
    "exclude": [
        "node_modules",
        "typings/index",
        "typings/index.d.ts"
    ]

选项设置为在保存时编译,但每当我保存 TypeScript 文件时,javascript 输出都会在源文件“下方”或“附加到”源文件中结束:

TypeScript
|
--test.ts 
    |
    --test.js

,它在物理上与源 /TypeScript 位于同一目录中。如果tsconfig.json 缺失,编译器会报错,但当它存在时,编译器会忽略"outDir": "../wwwroot/appScripts/" 设置。

我真的是 Gulp 的新手,但 Gulp 任务对我来说看起来不错:

var tsProject = ts.createProject('scripts/tsconfig.json');
gulp.task('ts', function (done) 
    //var tsResult = tsProject.src()
    var tsResult = gulp.src([
            "scripts/*.ts"
    ])
        .pipe(ts(tsProject), undefined, ts.reporter.fullReporter());
    return tsResult.js.pipe(gulp.dest('./wwwroot/appScripts'));
);

【问题讨论】:

什么是ts?是这个 gulp typescript 模块吗? npmjs.com/package/gulp-typescript 保存时编译在看什么? 【参考方案1】:

选项设置为保存时编译

当您保存文件时,它会自动编译该单个文件和导入该文件的文件。从您的 IDE 中关闭自动编译选项,因此编译器将考虑 tsconfig.json 文件。

在命令行中指定输入文件时, tsconfig.json 文件被忽略。

目录中存在 tsconfig.json 文件表明该目录是 TypeScript 项目的根目录。 tsconfig.json 文件指定编译项目所需的根文件和编译器选项。项目通过以下方式之一编译:

使用 tsconfig.json

    通过在没有输入文件的情况下调用 tsc,在这种情况下,编译器会从当前目录开始搜索 tsconfig.json 文件并继续沿父目录链查找。

    通过在没有输入文件和 --project(或仅 -p)命令行选项的情况下调用 tsc,该选项指定包含 tsconfig.json 文件的目录的路径。

https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

【讨论】:

感谢您的回答!这让我发疯,直到我想起我最近在 tsconfig.json 中添加了 '"compileOnSave": true'。 我仔细指定了所有这些编译器选项,然后,在一次未记录和奇怪的行为中,编译器忽略了编译器选项......因为我指定了一个输入文件?什么? 当您指定要编译的文件时,tsc 忽略您的配置文件是否有合理的原因?当您尝试通过在单个文件上测试配置以提高速度来调试配置时,这尤其令人讨厌。 5 年了,仍然准确。这应该是公认的答案。

以上是关于为啥 TypeScript 编译器会忽略 tsconfig.json?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 .NET 的 Scala 编译器会忽略 val 的含义?

为啥使用“if-else”语句会在看似相同的三元运算符构造不会产生 TypeScript 编译器错误?

静音/忽略来自 TypeScript tsc 的 TS2307 错误

为啥默认禁用 TypeScript 中的不安全/非严格编译器规则?

为啥 Typescript 编译器不会将 .ts 更改为 .js?

为啥 Hibernate 会忽略 package-info.java?