TypeScript 错误 TS2403:后续变量声明必须具有相同的类型

TypeScript error TS2403: Subsequent variable declarations must have the same type

我的 TypeScript 项目似乎 运行 出现了一些编译错误。完整的错误是:

node_modules/@types/mocha/index.d.ts:2680:13 - error TS2403: Subsequent 
variable declarations must have the same type.  Variable 'beforeEach'
must be of type 'Lifecycle',  but here has type 'HookFunction'.

2680 declare var beforeEach: Mocha.HookFunction;
                 ~~~~~~~~~~

我有 7 个这样的错误都在同一个依赖项 (Mocha) 中。我正在使用 TypeScript ^3.3.3,这是我的 tsconfig.json:

{
  "compilerOptions": {
    "composite": false,
    "declaration": true,
    "declarationMap": true,
    "removeComments": true,

    "target": "es2017",
    "lib": ["dom", "es2015", "es2016", "es2017"],
    "module": "commonjs",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "resolveJsonModule": true,

    "jsx": "preserve",
    "allowJs": false,
    "strict": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "sourceMap": true,
    "outDir": "build",
    "noUnusedParameters": true,

    "noUnusedLocals": false,

    "baseUrl": ".",
    "paths": {
      "*": ["./types/*"],
    },

    "rootDir": "./src",

    "typeRoots": ["./@types", "./node_modules/@types"]
  },

  "exclude": [
    "node_modules",
    "build",
    "dist",
    "__mocks__",
    "__tests__",
    "coverage",
    "*.config.js",
    "*.babel.js",
    "*.test.ts",
    "specs"
  ]
}

此外,这些是我的开发依赖项:

"devDependencies": {
  "@types/jest": "^24.0.9",
  "@types/koa": "^2.0.48",
  "@types/lodash": "^4.14.121",
  "@types/mocha": "^5.2.6",
  "@types/twig": "^1.12.2",
  "@types/uuid": "^3.4.4",
  "chai": "^4.1.2",
  "concurrently": "^4.1.0",
  "db-migrate": "^0.11.5",
  "dotenv": "^6.0.0",
  "grunt": "^1.0.3",
  "grunt-cli": "^1.2.0",
  "jest": "^23.1.0",
  "nodemon": "^1.17.2",
  "ts-jest": "^23.10.5",
  "ts-node": "^8.0.2",
  "tslint": "^5.14.0",
  "typescript": "^3.3.3"
}

这是我的编译命令:

tsc src/index.ts

您可以将 @types/mocha 替换为 @types/jest

看起来 @types/mocha@types/jest 有相似的声明。因此,如果两者都有,请卸载 @types/mocha:

npm uninstall @types/mocha.

这解决了我的问题。

我在 tsconfig 文件中添加了以下 属性

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

这告诉 TypeScript 我们要跳过 node_modules 文件夹中库的类型检查。这可以节省编译时间并阻止节点模块中的冲突类型破坏构建。 对于那些想要解释为什么你可能需要这个选项的人,这里有一个资源 link https://www.typescriptlang.org/tsconfig#skipLibCheck

TL;DR:不,您不能将 mocha(以及其他使用 mocha 的测试运行器,例如 web-test-runner)放在同一个模块中。

类型只能定义一次,mochajest 声明了一系列彼此不兼容的全局变量(需要它们才能直接使用而无需导入)。您需要选择一个或另一个,或者如果您使用 web-test-runnerelectron-mocha 之类的东西,只需选择另一个跑步者(例如 cypress 就可以)。

任何解决方法都会隐藏一个或另一个,因此最终您无法同时使用它们。归根结底,将两个测试运行器声明为依赖项可能不是一个好主意,因此您不妨重构代码以选择其中一个。