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

我怎样才能消除这些错误呢?


我也有同样的问题。在我的例子中,这是选项:allowJs: true的结果。

所以我基本上要去掉这一行来消除错误。 我在您的代码中没有看到它,但它可能在这里对您有帮助。


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

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


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

添加"outDir": "。/dist”到tsconfig中的compilerOptions。json为我工作时,我得到这个错误。我很确定这只是Visual Studio Code TypeScript扩展输出这个错误。我使用ts-loader与Webpack,而不是tsc编译器直接,所以我不必指定outDir,因为Webpack配置控制,但如果这使VS Code扩展高兴,这是好的。


outDir集。

"outDir": "./",

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


我通过从我的tsconfig中删除“declaration”:true来解决这个问题。json文件。不过现在我没有声明了,所以没用。


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

eg:

\index.ts
\index.tsx

解决方案是将其中一个文件名更改为其他名称。


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

将一个从库中导入的文件从app移动到库中,会导致现在在库中的文件从它自己的dist文件夹中导入东西。

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


将'dist'添加到tsconfig中排除的目录中。Json很适合我:

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

这有几个可能的原因。

In your tsconfig.json: Set outDir to "dist" or the name of another same-level folder. (prefixing with './' is unnecessary). This is where the build files go. Set allowJs to false or delete the line. Note: enabled, allowJs will conflict with the declaration setting/flag. It isn't enabled by default. Include "dist" (or your build folder) in exclude. In your package.json: Set main to "index" or some other chosen name. Don't prefix with the build folder (eg "dist/index"), nor the unnecessary "./". Set types (modern alias of typings) to "index". Adding the extensions (.d.ts or .js) is unnecessary.

虽然你可以有一百万种不同的方法,但是为了简单和加深理解,最好一开始坚持常用的实践——比如使用“dist”,简单的tsconfig。Json和包。Json文件在树的同一级别,以此类推。当然,查找node_modules的文件也会加深您的理解,但生活中还有更有意义的事情。


我也有同样的问题。在我的情况下,这是因为我在一个模块中有两个同名的文件: index.ts index.tsx。

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


我遇到过这个问题,因为VSCode自动完成dist/文件夹中的文件。

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

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

import { SomeClass } from './someclass' 

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

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

添加构建到排除选项修复了这个问题。

排除:[“资源/ js / * * / *”、“node_modules”,“构建”)


这个配置适合我

"allowJs": true

set allowJS: true不是woI set outDir: true,它是工作


因为这个问题可能有很多原因!我要分享我的经验,当我遇到错误!

一个故事

对我来说!我有两个文件!一个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

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


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

步骤1。

比较

node -v

and

nvm -ls

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

nvm use {neededVersion}

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

步骤2。

确定IDE中的当前节点。例如在WebStorm中: Node.js和NPM | Typescript:节点解释器-设置所需的版本。


在我的例子中,我只是把"module": "commonjs"改为"module": "esnext",它就修复了它。


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提供的令人敬畏的错误消息…哇,很多不相干的东西。


我也遇到了错误:无法写入文件'xx\xxx.js',因为它会覆盖输入文件。

我发现:

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

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

您需要指定outDir,或者设置noEmit: true,以避免生成类似JavaScript源代码的编译器输出文件。


当你在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类型开始出现在我的目录中。

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


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


在我的情况下,这是因为我不小心包含了一个类从dist目录:

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

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


我遇到同样的问题,我尝试了以上的解决方案。没有一个对我有效。 然后删除构建文件夹在我的case - lib和重新运行构建cmd为我工作。


使用tsc——build——explainFiles来跟踪.d。Ts被包含在您的构建中!

e.g.

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

在这种情况下,我应该导入'..'以外的东西…

看到https://www.typescriptlang.org/tsconfig explainFiles


来自另一个答案的allowJs选项让我想到,也许我的配置不允许在项目中使用JavaScript文件。

因此,我没有像人们推荐的那样使用outDir,而是将有问题的.js重命名为.ts。

当然,这是一个样板项目,该文件是整个(TypeScript)项目中唯一的JavaScript文件。


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

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

在VS Code中:

Shift + command + P打开Mac上的命令托盘。开始输入“TypeScript”,并导航到“TypeScript: Restart TS Server”。按回车键

如果幸运的话,已修复的错误应该会自动消失。


正如GitHub问题中所建议的那样,理解这个问题的最佳选择是使用tracerresolution标志启动tsc命令

tsc - traceResolution