如何强制 tsc 忽略 node_modules 文件夹?

288

我正在使用tsc构建任务。不幸的是,我总是从node模块文件夹中得到相同的错误。

Executing task: .\node_modules\.bin\tsc.cmd --watch -p .\tsconfig.json <
node_modules/@types/node/index.d.ts(6208,55): error TS2304: Cannot find name 'Map'.
node_modules/@types/node/index.d.ts(6215,55): error TS2304: Cannot find name 'Set'.
node_modules/@types/node/index.d.ts(6219,64): error TS2304: Cannot find name 'Symbol'.
node_modules/@types/node/index.d.ts(6225,59): error TS2304: Cannot find name 'WeakMap'.
node_modules/@types/node/index.d.ts(6226,59): error TS2304: Cannot find name 'WeakSet'.
10:13:18 - Compilation complete. Watching for file changes.

我已经将该目录添加到tsconfig.json中的忽略列表中。


    {
      "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "sourceMap": true,
        "strict": false,
        "noImplicitAny": false,
        "strictPropertyInitialization": false,
        "esModuleInterop": true,
      },
      "include": [
        "src/*"
      ],
      "exclude": [
        "node_modules",
        "./node_modules",
        "./node_modules/*",
        "./node_modules/@types/node/index.d.ts",
      ]
    }

我做错了什么?为了忽略这些错误,我应该怎么做?

我正在使用VsCode和tsc 2.9.2版本。


1
这可能会有所帮助:“...为此,编译器需要模块的定义,这可以是您自己代码的.ts文件,也可以是导入的定义文件的.d.ts文件。如果找到该文件,则无论它是否在之前的步骤中被排除,都将被包含在内。” -> https://github.com/Microsoft/TypeScript/wiki/FAQ#why-is-a-file-in-the-exclude-list-still-picked-up-by-the-compiler - Adam Cooper
我想要类型。我不想建立我的项目。为此,我正在使用JSDoc,因为它使用运行程序将忽略的注释。我能找到的唯一一个可以针对JSDoc检查我的类型的CLI是带有“noEmit”: true和“checkJs”: true的Typescript CLI。但是,然后我会从node_modules/utils/utils.js中获得错误。我不想要这些错误。我该如何删除它们? - RedGuy11
重新启动IDE或在VSCode中使用“F1→TypeScript: Reload Project”可能有助于消除一些已报告的问题。 - cachius
14个回答

447

快速解决方案是跳过检查

{
  "compilerOptions": {
    "skipLibCheck": true
  },
}

10
相关文档请参考:https://www.typescriptlang.org/docs/handbook/compiler-options.html。 - jocull
13
这也会跳过所有声明文件 *.d.ts 的类型检查。https://dd.engineering/blog/typescript-the-skiplibcheck-option-explained - Gianfranco P.
5
skipLibCheck 只针对 node_modules 文件夹吗? - Dilip Agheda
38
不,它也会针对node_modules之外的任何d.ts文件进行操作,因此这可能不是大多数人想要的。 - KevinH
2
请注意,tsc --listFiles似乎忽略了这个参数,它仍然会显示node_modules typings(TS 4.2)。 - Eric Burel
显示剩余8条评论

70
在“compilerOptions”中添加一个空的“types”选项:
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "sourceMap": true,
    "strict": false,
    "noImplicitAny": false,
    "strictPropertyInitialization": false,
    "esModuleInterop": true,
    "types": []
  },
  "include": [
    "src/*"
  ],
  "exclude": [
    "node_modules",
    "./node_modules",
    "./node_modules/*",
    "./node_modules/@types/node/index.d.ts",
  ]
}

来自 https://www.typescriptlang.org/tsconfig#typeRoots

@types、typeRoots 和 types

默认情况下,编译时会包含所有可见的“@types”包。任何封闭文件夹中的 node_modules/@types 中的包都被视为可见;具体来说,这意味着 ./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/ 等文件夹中的包。

...

指定 "types": [] 以禁用 @types 包的自动包含。

请记住,自动包含仅在使用具有全局声明的文件(而不是声明为模块的文件)时才重要。例如,如果您使用 import "foo" 语句,TypeScript 仍然可能查找 node_modules 和 node_modules/@types 文件夹以找到 foo 包。


5
@MichaelOzeryansky:抱歉,我不明白你的观点。我只是在 OP 的 tsconfig.json 文件中添加了一行代码。 - Mic
2
@MichaelOzeryansky,这个添加可能会让你的编译速度更快。代码行数并不是自动导致编译时间变慢的原因。代码行数少并不会让你的代码运行更快。但需要注意的是,这将防止许多项目在不再包含所需类型的情况下进行编译,需要进行其他重大更改。 - SgtPooki
将CLI指定为空列表对我很有用,就像这样:tsc ./myfile.ts --types --someOtherOption - Anton Belonovich

68

你可以直接在命令行上完成这个操作

tsc --skipLibCheck

这样做更好,因为如果您使用Webpack插件来验证包含的库类型,则在Webpack构建期间将验证库类型。 - scott dickerson
这对我有用(TS 4.4.4)。尽管我已经在tsconfig中指定了它,但显然我需要像你的解决方案一样明确地进行设置。 - Sander Looijenga
2
关于我上面的评论:我没有阅读文档,我在我的tsc命令中指定了一个文件,正如文档中明确说明的那样,这将忽略tsconfig;https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#using-tsconfigjson-or-jsconfigjson - Sander Looijenga

47

我遇到了typescript@3.2.1的问题,并通过升级到3.7.3来解决它。

请注意,当使用typescript@3.2.1时,skipLibCheck不起作用。当我升级TypeScript时,skipLibCheck: true生效了。


9
已升级到最新版本3.9.7,并添加了skipLibCheck,非常有帮助。 - user1769790
1
酷炫的更新TS版本。 - Sun

42

tsconfig.json中设置"skipLibCheck": true


9
在使用yarn工作区的monorepo时,我遇到了类似的问题。后来发现我的应用程序使用了与根工作区不同的TypeScript版本,将它们同步解决了这个问题。
您可以通过运行`yarn list typescript`或`npm ls typescript`在您自己的repo中验证此问题。
如果您有多个TypeScript版本,请升级低版本项目以使所有项目都具有当前在您的repo中使用的最高版本,例如 `yarn add -D typescript@4.5.5`(或您需要的任何版本)。

2
是的。其他方法都对我没用,但这个有效。谢谢! - VaibhavJoshi
2
这是我唯一的解决方案,因为我的全局和本地版本不同。 - BlaShadow
1
同样的问题,但是使用npm工作区。谢谢! - JoshStrange

5
如果你在这里,而且以下任何一项都无法解决你的问题:
  • 升级/降级 TypeScript 版本 (注意:当你运行 tsc 命令时,全局安装的 TypeScript 版本会被用作编译器。因此,即使你在 package.json 中有最新的 TypeScript 版本,你也必须全局升级 TypeScript。使用 npm 的命令是 npm install typescript@latest -g

  • 添加/编辑 tsconfig 选项:target、types、include、exclude、allowJs、skipLibCheck

  • npm update

  • 删除 node_modules 并执行 npm i

  • 删除 package-lock(顺便说一句,不要这样做)并执行 npm i

我想在这里为您留下TypeScript配置文档中的链接: “types”影响了什么? 有了这个知识,这解决了我的问题
  1. 运行tsc时,在日志中查看导致错误的模块。(对我来说是node_modules/mongoose/types/*,所以mongoose是罪魁祸首。)
  2. 将所有ES6导入该模块的语句转换为commonjs的require()。(在我的情况下,import mongoose from 'mongoose' --> const mongoose = require('mongoose')
希望这可以解决您的问题。

4
这对我来说发生是因为我不小心导入了一个不属于公共API的库。 例如,import { ValidationErrorCode } from '@apollo/server/src/plugin/schemaReporting/generated/operations'; 导致 tsc@apollo/server 中报告类型错误。从 src/dist/ 导入应该始终引起警惕。

这是我的问题,我导入了react-map-gl没有其他输出的类型,并且忘记了它,导致了这个问题。谢谢你对我来说非常准确,我为此问题苦恼了很久。 - ShaneTheKing

4

升级你的typescript和ts-node: "typescript": "4.9.4" "ts-node": "10.9.1"

在构建时使用--skipLibCheck标志或将其放入tsconfig.json文件的compilerOtions中("skipLibCheck": true)...


3
如果你来到这里,而其他答案都没有解决问题,那么请检查一下是否设置了maxNodeModuleJsDepth。如果启用了allowJs选项,则该选项允许TypeScript从node_modules中的模块推断类型,而skipLibCheck对此没有任何影响,因为它正在读取JavaScript文件而不是类型声明。默认情况下maxNodeModuleJsDepth的设置为0,在绝大多数情况下这就是你想要的(你应该更喜欢使用@types包而不是开启它)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接