在Visual Studio 2015 Update 3中的Typescript 2.2.1项目中,我在错误列表中得到了数百个错误,例如:
不能写入文件'C:/{{my-project}}/node_modules/buffer-shims/index.js',因为它会覆盖输入文件。
它一直都是这样的。它实际上并没有阻止构建,并且一切都可以正常工作,但是错误列表会分散注意力,并且很难在发生“真正的”错误时定位它们。
这是我的tsconfig。json文件
{
"compileOnSave": true,
"compilerOptions": {
"baseUrl": ".",
"module": "commonjs",
"noImplicitAny": true,
"removeComments": true,
"sourceMap": true,
"target": "ES5",
"forceConsistentCasingInFileNames": true,
"strictNullChecks": true,
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"noFallthroughCasesInSwitch": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"typeRoots": [],
"types": [] //Explicitly specify an empty array so that the TS2 @types modules are not acquired since we aren't ready for them yet.
},
"exclude": ["node_modules"]
}
我怎样才能消除这些错误呢?
在我的实例中,我使用了outDir选项,但没有从输入中排除目标目录:
// Bad
{
"compileOnSave": true,
"compilerOptions": {
"outDir": "./built",
"allowJs": true,
"target": "es5",
"allowUnreachableCode": false,
"noImplicitReturns": true,
"noImplicitAny": true,
"typeRoots": [ "./typings" ],
"outFile": "./built/combined.js"
},
"include": [
"./**/*"
],
"exclude": [
"./plugins/**/*",
"./typings/**/*"
]
}
我们所要做的就是排除outDir中的文件:
// Good
{
"compileOnSave": true,
"compilerOptions": {
"outDir": "./built",
"allowJs": true,
"target": "es5",
"allowUnreachableCode": false,
"noImplicitReturns": true,
"noImplicitAny": true,
"typeRoots": [ "./typings" ],
"outFile": "./built/combined.js"
},
"include": [
"./**/*"
],
"exclude": [
"./plugins/**/*",
"./typings/**/*",
"./built/**/*" // This is what fixed it!
]
}
因为这个问题可能有很多原因!我要分享我的经验,当我遇到错误!
一个故事
对我来说!我有两个文件!一个src /索引。另一个是src/test/logToFile.directTest.ts。
src /测试/ logToFile.directTest除外。问题解决了!
似乎每个决议都试图写入同一个文件!
我对声明的配置是:
{
"compilerOptions": {
"declaration": true,
"declarationDir": "./dist",
"module": "commonjs",
"noImplicitAny": true,
"lib": ["ESNext", "DOM"],
"outDir": "./dist",
"target": "es6",
"moduleResolution": "node",
"resolveJsonModule": true,
"esModuleInterop": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
一切都设置正确!您可以注意到我排除了dist目录。并正确地设置必要的outDir(如果不这样做,您可能会得到错误!)所有其他的答案都提到了这一点)。
更多的是,我使用配置与其他存储库和包!我没有任何问题!
最后!是这样的:
import { Logger } from '../..';
我的意思错了!
它应该是:
import { Logger } from '..';
移植模块到它自己的存储库我忘记改变导入!
我还把文件放回去了!经过测试,一切都运行良好!
并从故事中带来利益!
如果所有有意义的解决方案(或要做的事情)都得到尊重,你仍然会遇到问题!确保在ts文件中检查您的导入!
导入可以引用根目录(例如)并自动重定向回dist!所以。d。ts文件!Typescript通常会抛出一个错误!作为站出来的目录文件夹!但它没有!并且犯了那个错误!
并带来更多的利益
解释错误
简而言之,描述如下:
https://github.com/microsoft/TypeScript/issues/6046#issuecomment-210186647
简而言之,输入文件要么是您在命令行传递的文件,要么是您在命令行传递的文件之一的依赖文件。
如果两个映射到同一个声明文件!当他们有相同的名字时就会发生这种情况!或者返回到声明文件本身!从文件导入!通过一个糟糕的导入(就像在我的情况下)!或者dist没有被忽略!
寻找进口是一件需要检查的事情!如果排除了dist目录并正确设置了outDir
很有趣的是,你可以通过这个命令检查输入文件:
tsc --listFiles
当问题存在时,您将在列表中找到声明文件!
TL;DR:使用单一回购?检查循环依赖关系!
您可能不小心从依赖于此包的包中导入了类型。
我也得到了这个错误,没有其他答案帮助我。我花了一些时间来确定它,但在浪费了至少一个小时之后,我发现潜在的错误是我的mono repo中包之间的循环依赖。
因此,我们使用yarn工作区,并拥有一个与Zilliqas非常相似的单一回购结构(我们的回购还不是开源的,所以不能链接到它)。
在包A中,我意外地(不知道怎么…)从包B中导入了一个类型,但包B反过来依赖于包A——我在packages/packageB/package.json中明确地声明了:
"dependencies": {
...,
"@mycompany/packageA": "^0.0.0",
...
}
这是正确的。但不幸的是,在我的例子中,可能会意外地从包B中导入一个类型,即packages/packageA/_types。但是由于我没有显式地声明(因为依赖是隐式的,不需要的和意外的)这个依赖在packages/packageA/package中。在“依赖”下的Json, typescript编译器(tsc)没有检测到依赖循环,但仍然未能构建…
所以,是的,感谢TypeScript提供的令人敬畏的错误消息…哇,很多不相干的东西。
当你在lerna包项目或monorepo项目中,它可能工作:
首先,你的项目是这样的
packages\
core\
tsconfig.json
package.json
common\
tsconfig.json
package.json
tsconfig.base.json
你package.json
...
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"files": [
"lib"
],
...
你tsconfig.json
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
"outDir": "./lib",
},
}
您将发现无论如何更改tsconfig。Json文件,它不起作用
这就是我的解
先删除你的outDir:"lib",或者使用命令rd lib /s /q,然后运行tsc,就可以了
没有一个答案对我有用,所以我将分享可能导致这个问题的事情:
您应该添加outDir(或者至少是declarationDir)来排除。
"exclude": ["node_modules", "types"]
如果你的rootDir包含任何。js代码而没有指定outDir,那么它将尝试编译和覆盖原始的javascript,在这种情况下,你可以指定一个outDir。
"outDir": "lib"
这真的是一个“抓住你”的问题……如果你从任何地方导入任何东西,typescript都会编译,检查并生成它的类型声明。你的include或exclude里面有什么并不重要,你的rootDir设置为什么也不重要,如果你导入了一些东西,它就会被使用、输入、覆盖和输出,你之前的配置都不会被尊重。
例如,如果你有:
- /src
- tsconfig.json
- randomJsFile.js
:
"rootDir": "src"
And:
"include": ["src/**/*.ts"]
然后你将randomJSfile.js导入到任何/src文件的任何地方,它将生成一个*.d。Ts文件就在那个文件旁边(它甚至不会输出到你的类型目录),它会尝试覆盖那个文件。
简而言之,这意味着您应该注意导入的内容,不要将rootDir之外的任何内容导入到项目中(node_modules除外)。
这是一个让我试图从../webpack.config.js导入配置*.d。Ts类型为webpack生成(甚至不在types目录中,只是在那里随机放置,根本不尊重tsconfig),它也会尝试覆盖导入的文件并中断。一直想知道为什么当我导入配置时,完全随机的webpack类型开始出现在我的目录中。
如果您启用了增量构建,并且它只在某些时候中断(或者如果您删除了这些类型,但它们似乎(暂时)消失了),那么这就更有趣了。