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

CBa*_*arr 34 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错误列表

这是我的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"]
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能摆脱所有这些错误?

jca*_*ll1 40

由于 VSCode 自动完成文件dist/夹中的文件,我遇到了这个问题。

import { SomeClass } from '../../dist/xxx/someclass' 
Run Code Online (Sandbox Code Playgroud)

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

import { SomeClass } from './someclass' 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。这也发生在我身上。只要在导入过程中有点懒惰和分心就足以转到 StackOverflow :( (3认同)
  • 我也发生过。找到发生这种情况的快速方法是删除“dist”文件夹,然后检查 IDE 错误。 (3认同)

小智 29

我遇到了同样的问题.在我的情况下,这是选项的结果:allowJs: true.

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

祝好运!

  • 这是错误的答案。这只是掩盖了问题,实际的问题是OP正在尝试构建输出目录(它恰好包含js文件,因此这掩盖了问题)。正确的解决方案是排除[输出目录](/sf/answers/3415926181/) (8认同)
  • 就我而言,在“tsconfig.json”文件中,我注释掉了“allowJs:true”。它工作正常。谢谢你!!! (5认同)
  • 只在`“ exclude”:[“ node_modules”,“ dist”]`中排除`outDir:“ ./dist”`,就可以了,因为这些目录包含`javascript`文件 (3认同)

小智 26

所有答案都不适合我,所以我将分享可能导致此问题的事情:

  1. 您应该将outDir(或至少是declarationDir)添加到exclude
"exclude": ["node_modules", "types"]
Run Code Online (Sandbox Code Playgroud)
  1. 如果您rootDir包含任何.js代码但未指定 ,outDir那么它将尝试编译并覆盖原始 javascript,在这种情况下您可以指定outDir.
"outDir": "lib"
Run Code Online (Sandbox Code Playgroud)
  1. 这确实是一个“陷阱”……如果您从任何地方导入任何内容,打字稿将对其进行编译、检查并生成类型声明。无论你的includeor里面有什么exclude,你的设置是什么也不重要rootDir,如果你导入一些东西,它将被使用、键入、覆盖和输出,并且你之前的配置都不会被尊重。

例如,如果您有:

- /src
- tsconfig.json
- randomJsFile.js
Run Code Online (Sandbox Code Playgroud)

和:

"rootDir": "src"
Run Code Online (Sandbox Code Playgroud)

和:

"include": ["src/**/*.ts"]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Jai*_*Jai 25

这有几个可能的原因。

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

尽管您可以拥有一百万种不同的方式,但为了简单起见并加深理解,最好首先坚持通用实践 - 例如在树中的同一级别使用“dist”、简单的tsconfig.jsonpackage.json文件, 等等。当然,翻阅你的 node_modules 文件也会加深你的理解,但生活中还有更多有意义的事情。

  • 我的包是 monorepo 中的共享库。如果我在 package.json 中设置 `{ "main": "index.js" }` 而不是 `{ "main": "./build/index.js" }`,那么包的客户端如何知道从哪里导入`./dist`? (如果我使用不同的名称,例如“./build”怎么办?) (7认同)

Vin*_*rst 20

在我的实例中,我使用的是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/**/*"
    ]
}
Run Code Online (Sandbox Code Playgroud)

我们所要做的就是排除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!
    ]
}
Run Code Online (Sandbox Code Playgroud)

  • 我最初没有 outDir,所以我添加了它并同时排除了它,它起作用了 (5认同)

小智 12

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


Kin*_*ng. 12

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

我发现这些:

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

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

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


Rea*_*oon 12

就我而言,这是因为我不小心包含了 dist 目录中的一个类:

import {Entities} from "../../dist";
Run Code Online (Sandbox Code Playgroud)

刚刚删除了这条线,现在一切都很好。


Saj*_*jon 11

TL;DR:使用单回购?检查循环依赖!

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

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

因此,我们使用 yarn 工作区并具有与 Zilliqas 非常相似的单一存储库结构(我们的存储库尚未开源,因此无法链接到它)。

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

"dependencies": {
    ...,
    "@mycompany/packageA": "^0.0.0",
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是正确的一口井。但不幸的是,package B在我的情况下可能会意外地导入一个类型,packages/packageA/_types.ts但由于我没有明确说明(因为依赖是隐含的、不需要的和偶然的),打字稿编译器 ( )packages/packageA/package.json"dependencies"的这种依赖tsc没有检测到依赖循环,但仍然构建失败...

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


she*_*nan 8

我在相当大的 monorepo 中进行开发时遇到了这些错误,其中各种包依赖于对其他 TypeScript 包的引用。尽管这些错误不会影响构建或运行时,但打开文件时它们仍然出现在 VS Code 问题面板中tsconfig.json

上面的一些答案确实帮助我减少了错误数量,但直到我重新启动 VS Code TypeScript 服务器后,所有错误似乎都神奇地消失了。

在 VS 代码中:

Shift+ command+P在 Mac 上打开命令面板。开始输入“TypeScript”并导航到“TypeScript:重新启动 TS Server”。按Enter

如果幸运的话,固定的错误应该会自动消失。


Map*_*pad 7

将``dist''添加到tsconfig.json中的排除目录对我有用:

{
  "exclude": ["node_modules", "dist"]
}
Run Code Online (Sandbox Code Playgroud)


mkb*_*mkb 6

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

例如:

\index.ts
\index.tsx
Run Code Online (Sandbox Code Playgroud)

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


Moh*_*lal 6

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

一个故事

就我而言!我有两个文件!一个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"]
}

Run Code Online (Sandbox Code Playgroud)

一切都设置正确!您可以注意到我排除了dist目录。并正确设置哪些outDir是必要的(如果不这样做,您可能会收到错误!所有其他答案都提到了这一点)。

更重要的是我将配置与其他存储库和包一起使用!而且我没有任何问题!

在最后 !是这样的:

import { Logger } from '../..';
Run Code Online (Sandbox Code Playgroud)

我的导入错误!

本来应该是:

import { Logger } from '..';
Run Code Online (Sandbox Code Playgroud)

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

我还包含了该文件!并进行了测试,一切正常!

并从故事中带来好处!

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

导入可以引用 root(例如)并自动重定向回 dist!.d.ts 文件也是如此!Typescript 通常应该抛出错误!因为那个目录文件夹脱颖而出!但事实并非如此!并犯了这个错误!

并为大家带来更多的利益

解释错误

简而言之,这里描述的是:

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

简而言之,输入文件要么是您在命令行上传递的文件,要么是您在命令行上传递的文件之一的依赖项。

如果两个映射到同一个声明文件!当他们同名时就会发生这种情况!或者参考声明文件本身!从文件导入!通过错误的导入(就像我的例子)!或者那个 dist 没有被忽略!

寻找进口产品是一件需要检查的事情!如果您排除了该目录并正确dist设置了outDir

非常有趣的是,您可以通过此命令检查输入文件:

import { Logger } from '../..';
Run Code Online (Sandbox Code Playgroud)

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

  • `--explainFiles` 甚至更好! (5认同)

小智 5

设置outDir。

"outDir": "./",
Run Code Online (Sandbox Code Playgroud)

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


CBa*_*arr 0

看来这个问题已经通过更新到 Typescript 2.3.x 为我解决了

此外,使用 Visual Studio 2017 也是一个很大的改进。我强烈建议您进行这两项更新。

  • 我正在使用 VS2017 和 TypeScript 2.5.3 并看到同样的问题。进入一个干净的环境可能可以避免你的问题,但这并不能解决问题。 (5认同)