【问题标题】:Typescript error "Cannot write file ... because it would overwrite input file."打字稿错误“无法写入文件......因为它会覆盖输入文件。”
【发布时间】:2017-03-05 14:45:41
【问题描述】:

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

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

【问题讨论】:

  • 我也遇到了这个问题:/ 我检查了 github github.com/Microsoft/TypeScript/issues,但我看不到这个问题的票。你做了一个吗?
  • 好主意,我现在有了! github.com/Microsoft/TypeScript/issues/14538
  • 您找到解决这个@ChrisBarr 的方法了吗?我有同样的问题。请也看看。 stackoverflow.com/questions/44457138/…
  • @Sampath 在某种程度上我有...... TypeScript 的更新似乎已经为我解决了这个问题。此外,我已切换到 Visual Studio 2017,这也是一个很大的改进,我从未在那里看到此错误。
  • 好的,谢谢。希望你能发布你自己的答案然后你可以关闭这个线程不是吗? @ChrisBarr

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


【解决方案1】:

在我的例子中,我使用了 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!
    ]
}

【讨论】:

  • 天哪,我终于成功了!谢谢文斯!
【解决方案2】:

我遇到了同样的问题。就我而言,这是选项的结果:allowJs: true

所以我基本上不得不删除该行以消除错误。 我在你的代码中没有看到它,但也许它在这里对你有帮助。

祝你好运!

【讨论】:

  • 就我而言,在tsconfig.json 文件中,我注释掉了allowJs: true. 它工作正常。谢谢!!!
  • 只排除"exclude": [ "node_modules", "dist" ]中的outDir: "./dist"就完成了,因为这些目录包含javascript文件
  • 在我的例子中,我必须明确地将 allowJs 设置为 false。它不在那里。 (打字稿 v3.4.3)
  • 这是错误的答案。这只是掩盖了问题,实际问题是 OP 正在尝试构建输出目录(它恰好包含 js 文件,因此这掩盖了问题)。正确的解决方案是排除output directory
  • 当输出与当前目录相同时有效
【解决方案3】:

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

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

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

import { SomeClass } from './someclass' 

【讨论】:

  • 谢谢。它也发生在我身上。导入时稍有懒惰和分心就足以进入 StackOverflow :(
  • 也发生在我身上。找到发生这种情况的快速方法是删除 dist 文件夹,然后检查 IDE 错误。
  • 同样的事情,但更微妙:我正在创建一个库,它在 repo 的根目录中有一个 index.ts 文件,该文件具有来自 ./src 目录的所有相关导出。 VS 代码自动完成了我对index.ts 文件的一项导入,该文件类似于:import { Foo } from '..';。很难发现,但问题仍然存在。
【解决方案4】:

这有几个可能的原因。

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

虽然你可以有上百万种不同的方式,但为了简单起见和加深理解,最好首先坚持常用的做法——比如使用“dist”、简单的 tsconfig.json 和 package.json 文件,依此类推。当然,通过你的 node_modules 的文件生根也会加深你的理解,但生活中还有更多有价值的事情。

【讨论】:

  • 我的包是monorepo中的一个共享库。如果我在 package.json 中设置{ "main": "index.js" } 而不是{ "main": "./build/index.js" },那么包的客户端如何知道从./dist 导入? (如果我使用不同的名称,比如./build?)
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

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

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

    我也遇到了这个错误,其他答案都没有帮助我。花了一些时间来查明它,但在浪费了至少一个小时之后,结果发现潜在的错误是我的 mono repo 中的包之间的循环依赖。

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

    package A 内部,我不小心(不知道如何...)从package B 导入了一个类型,但package B 又依赖于package A - 我在@987654326 中明确说明了这一点@:

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

    这是正确的一口井。但不幸的是,在我的情况下,packages/packageA/_types.ts 可能会意外地从 package B 导入一个类型,但由于我明确声明了 NOT(因为依赖是隐式的、不需要的和意外的)@ 中的这种依赖"dependencies" 下的 987654330@ typescript 编译器(tsc)没有检测到依赖循环但仍然无法构建...

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

    【讨论】:

      【解决方案7】:

      出发目录。

      "outDir": "./",
      

      这个提示是,如果不设置outDir,那么输出会直接放在输入文件旁边。在allowJs之后,JavaScript文件也会被编译。然后,编译后的 JavaScript 文件将覆盖您的源文件。它只是提醒你这一点。

      【讨论】:

        【解决方案8】:

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

        【讨论】:

        • 使用 // @ts-check 和纯 Javascript 代码为我工作
        • 在 Vue 2 Vue CLI 应用程序中为我工作,T​​S 支持 VS Code 错误。
        【解决方案9】:

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

        1. 您应该将outDir(或至少declarationDir)添加到exclude
        "exclude": ["node_modules", "types"]
        
        1. 如果您的rootDir 包含任何.js 代码而未指定outDir,那么它将尝试编译并覆盖原始javascript,在这种情况下您可以指定outDir
        "outDir": "lib"
        
        1. 这确实是一个“陷阱”...如果您从任何地方导入任何内容,typescript 将对其进行编译、检查并生成类型声明。 includeexclude 中的内容无关紧要,rootDir 设置的内容也无关紧要,如果您导入某些内容,它将被使用、键入、覆盖和输出,而您以前的它的配置将受到尊重。

        例如,如果您有:

        - /src
        - tsconfig.json
        - randomJsFile.js
        

        与:

        "rootDir": "src"
        

        还有:

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

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

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

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

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

        【讨论】:

          【解决方案10】:

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

          例如:

          \index.ts
          \index.tsx
          

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

          【讨论】:

          • 谢谢,这正是我遇到的问题。更正了文件名,然后错误消失了
          【解决方案11】:

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

          一个故事

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

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

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

          最后!是这样的:

          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
          

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

          【讨论】:

          • --explainFiles 更好!
          【解决方案12】:

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

          我发现了这些:

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

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

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

          【讨论】:

            【解决方案13】:

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

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

            【讨论】:

              【解决方案14】:

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

              import {Entities} from "../../dist";
              

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

              【讨论】:

                【解决方案15】:

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

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

                build 添加到排除选项可解决问题。

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

                【讨论】:

                  【解决方案16】:

                  当您尝试运行一个具有两个节点的项目时,很可能会发生这种情况。 对于这个假设,您可以在运行构建后测试名为“node”的计算机上的进程数。 我做了什么来解决这个问题:

                  第 1 步。

                  比较

                  node -v
                  

                  nvm -ls
                  

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

                  nvm use {neededVersion}
                  

                  原则上删除nvm中不需要的节点版本(这样有助于你的IDE自动判断节点的正常版本)。

                  第 2 步。

                  确定 IDE 中的当前节点。即在 WebStorm 中: 首选项-> 语言和框架-> Node.js 和 NPM |打字稿:节点解释器 - 设置所需的版本。

                  【讨论】:

                    【解决方案17】:

                    我遇到了同样的问题,我尝试了上述解决方案。没有一个对我有用。 然后在我的情况下删除 build 文件夹 - lib 并重新运行 build cmd 对我有用。

                    【讨论】:

                      【解决方案18】:

                      似乎通过更新到 Typescript 2.3.x 为我解决了这个问题

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

                      【讨论】:

                      • 我正在使用 VS2017 和 TypeScript 2.5.3 并看到同样的问题。去一个干净的环境可能会绕过你的问题,但这并不是解决问题的方法。
                      • 我正在使用 TypeScript 3.7.2,我也看到了这个问题。
                      • 问题不是typescript版本,和上面的cmet一样,我使用了你推荐升级的更新版本的typescript(3.7.4),问题依旧
                      【解决方案19】:

                      我通过从 tsconfig.json 文件中删除 "declaration": true 解决了这个问题。虽然现在我没有声明了,所以这没有帮助。

                      【讨论】:

                        【解决方案20】:

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

                        【讨论】:

                          【解决方案21】:

                          当您在 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,就可以了

                          【讨论】:

                            【解决方案22】:

                            如果您在大型代码或 monorepo 中工作,有时只需重新启动编辑器就足够了,或者如果您正在使用 vscode 重新启动 typescript 语言服务器。

                            【讨论】:

                              【解决方案23】:

                              使用tsc --build --explainFiles 跟踪您的 .d.ts 是如何包含在您的构建中的!

                              例如

                              dist/index.d.ts
                                Imported via '..' from file 'mocks/mock-requests.ts'
                              

                              在这种情况下,我应该导入 '..' 以外的其他内容...

                              https://www.typescriptlang.org/tsconfig#explainFiles

                              【讨论】:

                                【解决方案24】:

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

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

                                有趣的是..这实际上是最好的重构..它保留了对文件的正确引用:)

                                【讨论】:

                                  【解决方案25】:

                                  这个配置适合我

                                  "allowJs": true
                                  

                                  【讨论】:

                                    【解决方案26】:

                                    设置allowJS: true 不是我设置outDir : true,它的工作

                                    【讨论】:

                                    • 这是错误的outDir不能取布尔值,只能传递字符串。
                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2022-10-02
                                    • 2017-11-10
                                    • 1970-01-01
                                    • 2011-05-08
                                    • 1970-01-01
                                    • 2017-02-28
                                    相关资源
                                    最近更新 更多