打字稿错误“无法写入文件......因为它会覆盖输入文件。”

时间:2017-03-05 14:45:41

标签: visual-studio typescript visual-studio-2015 typescript2.0

在Visual Studio 2015 Update 3中的Typescript 2.2.1项目中,我在错误列表中收到了数百个错误,如:

  

无法写入文件'C:/ {{my-project}} / node_modules / buffer-shims / index.js',因为它会覆盖输入文件。

它一直都是这样的。它实际上并没有阻止构建,并且一切正常,但是错误列表会分散注意力,并且在发生错误时很难找到“真正的”错误。

visual studio error list

这是我的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"]
}

如何摆脱所有这些错误?

23 个答案:

答案 0 :(得分:20)

我遇到了同样的问题。在我的例子中,它是选项的结果:allowJs: true

所以我基本上必须删除该行以摆脱错误。 我在你的代码中没有看到它,但也许它可以帮助你。

祝你好运!

答案 1 :(得分:16)

在我的实例中,我使用的是 outFile 选项,但未从输入中排除目标目录。

// 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!
    ]
}

答案 2 :(得分:10)

TL;DR:使用单存储库?检查循环依赖!

您可能不小心从依赖于此包的包中导入了一个类型。

我也遇到了这个错误,其他答案都没有帮助我。查明它花了一段时间,但至少浪费了一个小时后,结果证明潜在的错误是我的单存储库中的包之间的循环依赖。

所以我们使用 yarn 工作区并有一个单一的存储库结构 very similar to Zilliqas(我们的存储库尚未开源,因此无法链接到它)。

package A 中,我不小心(不知道如何...)从 package B 导入了一个类型,但是 package B 反过来又依赖于 package A - 其中我已在 packages/packageB/package.json 中明确说明:

"dependencies": {
    ...,
    "@mycompany/packageA": "^0.0.0",
    ...
}

这是正确的一口井。但不幸的是,在 package B 的情况下,我可能会意外地从 packages/packageA/_types.ts 导入类型,但由于我已经NOT 明确声明(因为依赖项是隐含的、不需要的和意外的) packages/packageA/package.json 下的 "dependencies" 中的此依赖项,打字稿编译器 (tsc) 未检测到依赖项循环但仍无法构建...

是的,感谢 TypeScript 提供了很棒的错误消息……哇,很多红鲱鱼。

答案 3 :(得分:3)

设置outDir。

"outDir": "./",

此提示是,如果您未设置outDir,则输出将直接放置在输入文件旁边。在allowJs之后,JavaScript文件也将被编译。然后,已编译的JavaScript文件将覆盖您的源文件。只是想提醒您。

答案 4 :(得分:2)

在出现此错误时,在tsconfig.json中的compileOptions中添加“ outDir”:“ ./ dist”对我有用。我很确定这只是输出此错误的Visual Studio Code TypeScript扩展。我将ts-loader与Webpack一起使用,而不是直接与tsc编译器一起使用,因此我不必指定outDir,因为webpack配置可以控制该操作,但是如果这使VS Code扩展感到满意,那就很好了。

答案 5 :(得分:2)

我也遇到错误:Cannot write file 'xx\xxx.js' because it would overwrite input file

我发现了这些:

如果未指定 outDir,.js 文件将在与生成它们的 .ts 文件相同的目录中发出。

为避免意外覆盖源文件,编译器会显示此错误。

您需要指定 outDir 或设置 noEmit: true 以避免发出 JavaScript 源代码等编译器输出文件。

答案 6 :(得分:2)

由于VSCode自动完成let arr = [ { "id": 1, "name": "group1", "users": [ { "id": 1, "name": "Mike" }, { "id": 2, "name": "Steve" }, { "id": 3, "name": "John" } ] }, { "id": 2, "name": "group2", "users": [ { "id": 4, "name": "Phill" }, { "id": 5, "name": "Joe" }, { "id": 6, "name": "Dominik" } ] } ]; function filterUsers(arr, name) { return arr.map(obj => { return { ...obj, "users": obj.users.filter(user => user.name === name) }; }); } console.log(filterUsers(arr, "Mike"));文件夹中的文件,我遇到了这个问题。

dist/

要解决此问题,只需修复导入:

import { SomeClass } from '../../dist/xxx/someclass' 

答案 7 :(得分:1)

通过更新到Typescript 2.3.x

似乎已经解决了这个问题

此外,使用Visual Studio 2017也是一项重大改进。我强烈建议您尽快 这些更新。

答案 8 :(得分:1)

最有可能的是,当您尝试使用两个节点运行一个项目时,会发生这种情况。 对于此假设,可以在运行构建后测试名为“节点”的计算机上的进程数。 我为解决该问题所做的事情:

第1步。

比较

node -v

nvm -ls

,正在使用的版本。 在终端机中,当前节点版本:

nvm use {neededVersion}

原则上,删除nvm中不必要的节点版本(这将帮助您的IDE自动确定节点的正常版本)。

第2步。

确定IDE中的当前节点。即在WebStorm中: 偏好->语言和框架-> Node.js和NPM | Typescript:节点解释器-设置所需的版本。

答案 9 :(得分:1)

我遇到了同样的问题,这是因为有exclude选项。如果指定exclude选项,则还必须添加输出目录。

我有类似"exclude": ["resources/js/**/*", "node_modules"]这样的排除选项,并且输出目录设置为outDir:"./build"

在排除选项中添加build可以解决此问题。

exclude:["resources/js/**/*", "node_modules", "build"]

答案 10 :(得分:0)

没有一个答案对我有用,所以我将分享可能导致此问题的原因:

  1. 您应该将 outDir(或至少 declarationDir)添加到 exclude
"exclude": ["node_modules", "types"]
  1. 如果您的 rootDir 包含任何 .js 代码而未指定 outDir,那么它将尝试编译并覆盖原始 javascript,在这种情况下,您可以指定一个 outDir .
"outDir": "lib"
  1. 这真的是一个“陷阱”......如果你从任何地方导入任何东西,打字稿将编译,检查并为它生成类型声明。您的 includeexclude 中的内容无关紧要,您的 rootDir 设置为什么也无关紧要,如果您导入某些内容,它将被使用、键入、覆盖和输出,并且您之前的任何配置都不会得到遵守。

例如,如果您有:

- /src
- tsconfig.json
- randomJsFile.js

与:

"rootDir": "src"

还有:

"include": ["src/**/*.ts"]

然后您在任何 /src 文件中的任何位置导入该 randomJSfile.js,它会在该文件旁边生成一个 *.d.ts 文件(它甚至不会将其输出到您的类型目录),它会尝试覆盖该文件。

简而言之,这意味着您应该小心导入的内容,不要将 rootDir 之外的任何内容导入您的项目(node_modules 除外)。

这是让我尝试 import config from ../webpack.config.js 为 webpack 生成 *.d.ts 类型的那个(甚至不在类型目录中,只是在那里随机放置,根本不尊重 tsconfig),它会还尝试覆盖导入的文件并中断。一直想知道为什么在我导入配置时完全随机的 webpack 类型开始出现在我的目录中。

如果您启用了增量构建并且它只会在某些时候中断(或者如果您删除这些类型并且它们似乎没有消失(现在)),这会更有趣。

答案 11 :(得分:0)

当你在 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,它会工作

答案 12 :(得分:0)

就我而言,我只是将 "module": "commonjs" 更改为 "module": "esnext" 并修复了它。

答案 13 :(得分:0)

因为问题可能有多种原因!我将分享我遇到错误时的经验!

一个故事

就我而言!我有两个文件!一个src/index.ts,另一个src/test/logToFile.directTest.ts

排除src/test/logToFile.directTest.ts可以解决问题! 似乎每种分辨率都试图写入同一文件!

我的声明配置为:

{
  "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"]
}

一切都正确设置!您会注意到 i已排除dist目录。并且正确设置必要的outDir(如果没有,您会得到错误!所有其他答案都提到了这一点。)

然后我将config与其他存储库和软件包一起使用!而且我没有任何问题!

最后!就是这样:

import { Logger } from '../..';

我的输入错误!

应该是:

import { Logger } from '..';

将模块移植到它自己的存储库中,我忘了更改导入!

我又把文件收录了!经过测试,一切正常!

并从故事中受益!

如果所有有意义的解决方案(或要做的事情)都得到遵守,您仍然会遇到问题!确保在ts文件中检查您的导入!

例如,导入可以引用root并自动重定向回dist!因此,.d.ts文件!打字稿通常应该抛出错误!那样站在目录文件夹之外!但事实并非如此!并犯了这个错误!

并带来更多利益

解释错误

简而言之,在这里进行描述:

https://github.com/microsoft/TypeScript/issues/6046#issuecomment-210186647

简而言之,输入文件要么是您在命令行上传递的文件,要么是与您在命令行上传递的文件之一相关的依存关系。

如果两个映射到同一个声明文件!当他们使用相同的名字时,可能会发生这种情况!或者返回声明文件本身!从文件导入!通过错误的导入(例如我的情况)!否则那个dist不会被忽略!

寻找进口商品需要检查!如果您排除了dist目录并正确设置了outDir

很高兴知道您可以通过以下命令检查输入文件

tsc --listFiles

问题出现后,您将在列表中找到声明文件!

答案 14 :(得分:0)

未设置allowJS: true的设置outDir : true,可以正常工作

答案 15 :(得分:0)

此配置对我有用

"allowJs": true

答案 16 :(得分:0)

我有同样的问题。就我而言,这是由于在一个模块中有两个同名文件而引起的: 索引 index.tsx。

我重命名了其中一个,问题得到解决。

答案 17 :(得分:0)

有多种可能的原因。

  • 在您的tsconfig.json中:
    • outDir设置为“ dist”或另一个相同级别文件夹的名称。 (不需要以“ ./”作为前缀)。这是构建文件所在的位置。
    • allowJs设置为 false 或删除该行。注意:启用后, allowJs 将与声明设置/标志冲突。默认情况下未启用。
    • exclude中包括“ dist”(或您的构建文件夹)。
  • 在您的package.json中:
    • main设置为“索引”或其他选定的名称。不要以build文件夹为前缀(例如“ dist / index”),也不要以不必要的“ ./”作为前缀。
    • typestypings的现代别名)设置为“索引”。不需要添加扩展名(.d.ts或.js)。

尽管您可以使用一百万种不同的方法,但是为了简单起见和加深理解,最好首先遵循常见做法-例如使用“ dist”,简单的 tsconfig.json 和<在树中同一级别的em> package.json 文件,依此类推。当然,扎根于您的node_modules文件也可以加深您的掌握,但是生活中还有更多有意义的事情。

答案 18 :(得分:0)

在tsconfig.json中排除的目录中添加“ dist”对我有用:

{
  "exclude": ["node_modules", "dist"]
}

答案 19 :(得分:0)

在我的情况下,由于同时开发了一个库和一个应用程序...

将从库中导入的文件从应用程序移动到库中,导致现在位于库中的文件将从其自己的dist文件夹中导入内容。

有趣的是..这实际上是在最佳状态下进行重构..它保留了对文件的正确引用:)

答案 20 :(得分:0)

问题的根源可能是生成同一模块的2个文件。因此,如果在同一个文件夹中有两个具有相同名称但具有不同扩展名的文件,则会导致此错误。

例如:

\index.ts
\index.tsx

解决方案正在将这些文件名之一更改为其他名称。

答案 21 :(得分:0)

我通过从tsconfig.json文件中删除constexpr auto* Action = my::_details::ActionSinglePrecision; 解决了这一问题。尽管现在我不再有声明,所以这无济于事。

答案 22 :(得分:0)

我也遇到了这个问题。就我而言,我恢复了文件\tools\JsEngine\typescriptServices.js的原始版本,该文件已解决。

我发现由于行(CRLF or CR)的结尾,Visual Studio更改了typescriptServices.js,此后VS无法以正确的方式运行它。