TypeScript编译器在使用继承的tsconfig文件时无法找到类型定义

9
我怀疑 tsconfig.json 的继承功能并不完全有效。而且 "typeRoots" 设置可能没有被正确或完全地继承。

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

(以下是文件夹结构)

web.site -> tsconfig.json
- typings
- node_modules
- scripts
  - ts
  - tests
    - ts -> tsconfig.json (this tsconfig extends/inherits web.site - see contents below)

如果我在我的web.site文件夹中运行tsc命令,它会找到typings并成功编译。这可能是因为它正确使用了typeRoots设置。
如果我在我的tests文件夹中运行tsc命令,它无法找到任何typings并且编译失败。您可以假设错误只是未能找到应该在“typings”文件夹中找到的声明引用。
我可以将同一文件从测试(失败)复制到根web.site,然后它就可以成功编译。
显然,它没有正确使用tsconfig.json,因为根据我设置的继承,它应该通过继承的typeRoots设置找到typings。 但是没有。
我应该忽略继承作为一种半成品并针对此使用单独的tsconfigs吗?
在web.site/tsconfig.json中:
{
"compileOnSave": true,
"compilerOptions": {
    "listFiles": true,
    "removeComments": true,
    "sourceMap": true,
    "module": "es6",
    "moduleResolution": "classic",
    "outDir": "scripts/js",
    "typeRoots": [
        "node_modules/@types",
        "typings"
    ]
},
"include":[
    "scripts/ts/**/*"
]

}

在 tests/tsconfig.json 中:
{
  "extends": "../../tsconfig.json",
    "compilerOptions": {
        "outDir": "js",
        "removeComments": false
    },
        "include": [
        "ts/**/*"
    ]
}

如果你在内部的tsconfig.json中添加了typeRoots,并且在路径上加上../..,会有什么效果? - cartant
@cartant 我确认,这个有效。但证明了继承中存在一个 bug?文档说路径应该相对于源文件。 - PandaWood
我不知道。也许吧。哪个文件是源文件?这里有一些歧义。我使用了 extends,但我的用例非常简单,我不记得详细阅读文档了。 - cartant
@cartant 的原始文件应该指的是它所在的文件 - 也就是说,这应该是有效的。 - PandaWood
谢谢@cartant,我很快就会做的。 - PandaWood
显示剩余2条评论
1个回答

2
这个问题有两个部分:
理解哪些属性可以继承,哪些不能
虽然我没有找到任何官方文档,但在最初的配置继承提案中有一些关于哪些属性可以被继承,哪些必须在叶子配置文件中的讨论。
通过我的实验,我发现一些基于路径的属性,例如baseUrlpaths,无法被继承。我没有尝试使用typeRoots,所以不能确定,但可能不支持设计。
理解相对路径如何解析
在解析路径时,TypeScript将使用叶子配置文件的位置(称为“起始文件”)作为当前工作目录来解析相对路径。
在您提到的示例中,没有办法成功地配置继承的typeRoots,因为当使用web.site/tsconfig.json时,node_modules在同级文件夹中,而当使用tests/tsconfig.json时,node_modules在上面的祖先文件夹中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接