Definitelytyped: Lodash 'WeakMap' 的所有声明必须具有相同的类型参数。

创建于 2017-01-28  ·  62评论  ·  资料来源: DefinitelyTyped/DefinitelyTyped

  • [x] 我尝试使用@types/lodash包但遇到了问题。
  • [ ] 我尝试使用 tsc 的最新稳定版本。 https://www.npmjs.com/package/typescript
  • [] 我有一个不适合StackOverflow 的问题。 (请在那里提出任何适当的问题)。
  • [ ] [提及](https://github.com/blog/821-mention-somebody-they-re-notified) 作者(见Definitions by:中的index.d.ts )以便他们可以回复.

    • 作者:@....

我在使用 Typescript 版本 2.2.0-dev.20170128 和 @types/lodash 版本 4.14.51 编译项目时发现了这个问题。 在我的情况下,tsconfig 使用 es6 目标。 错误信息是:

node_modules/@types/lodash/index.d.ts(19421,15): error TS2428: All declarations of 'WeakMap' must have identical type parameters.
如果我将文件浏览到错误消息中指示的行,我可以看到以下注释:

// Backward compatibility with --target es5

也许这就是问题的原因?
向所有人致以最诚挚的问候

最有用的评论

IMO,最好的解决方法是"skipLibCheck": true

修好后就可以取下来了。

所有62条评论

更多信息:以"lib":["es6", "scripthost", "dom"]为目标es5 "lib":["es6", "scripthost", "dom"]似乎导致了我的问题。 ES6 声明与此全局声明冲突。 删除全局定义允许我们的项目编译。 在模块中包含全局定义似乎是不好的做法......

作者提及: @bczengel - 谢谢!

我似乎只是从angular-seed-advancedbuild.js.dev gulp 任务中得到这个错误。 当我使用与任务相同的选项运行tsc

{
  'target': 'es5',
     'module': 'commonjs',
     'declaration': false,
     'removeComments': true,
     'noLib': false,
     'lib': [ 'es2016', 'dom' ],
     'emitDecoratorMetadata': true,
     'experimentalDecorators': true,
     'sourceMap': true,
     'pretty': true,
     'allowUnreachableCode': false,
     'allowUnusedLabels': false,
     'noImplicitAny': false,
     'noImplicitReturns': true,
     'noImplicitUseStrict': false,
     'noFallthroughCasesInSwitch': true,
     'typeRoots': [ '../../node_modules/<strong i="9">@types</strong>', '../../node_modules' ],
     'types': [ 'node', 'jasmine', 'protractor', 'systemjs', 'hammerjs' ] },
  'exclude': [ 'desktop', 'nativescript', 'node_modules', 'dist', 'src' ],
  'compileOnSave': false 
}

我不明白这个错误。

这个问题似乎是由于 TypeScript 编译器的变化而出现的。

使用

  • @types/node v6.0.52
  • @types/lodash v4.14.44

我能够编译:

  • 打字稿 v2.2.0-dev.20161229

但我无法编译

  • 打字稿 v2.2.0-dev.20170201

我相信问题出在 @types/lodash (因为它不匹配的WeakMap接口)。 只是之前版本的 TypeScript 没有捕捉到错误

你用纱线吗? 我使用纱线安装我的 deps 时遇到了这个错误。 使用 npm 时,一切正常。

编辑:原来 npm 解析为比纱线更旧的打字稿版本。 所以我的问题与@eschwartz报告的一致。

我还使用纱线来安装初始依赖项。

我的问题是最新版本的 Typescript,与 @eschwartz 相同。 我使用 npm。

WeakMap的定义最近在lib.es6.d.ts (PR 在这里)。 在 TS v2.1 中,它是:

interface WeakMap<K, V> {

但是在当前的夜生活中,它已更改为:

interface WeakMap<K extends object, V> {

lodash.d.ts中的存根与这个新定义不匹配。 长期的解决办法是改变WeakMap存根lodash.d.ts来匹配这个新的定义。 但在短期内不会与当前的 TS(v2.1)生产版本相匹配。 ¯\_(ツ)_/¯

我们可以在@types/lodash进行修复吗,预计 TypeScript lib.es6.d.ts发生变化? 似乎最好从@types/lodash完全删除WeakMap接口。

我只是不确定更新和版本控制如何与绝对类型中的类型一起使用。 有人可以给我一些指导吗?

@bczengel@chrootsu@stepancar - 你能分享你对这个问题的想法吗?

有修复吗?

或者也许是一个临时的解决方法?

我使用的解决方法是注释掉weakmap定义:

文件: node_modules\@types\lodash\index.d.ts

// Backward compatibility with --target es5
declare global {
    interface Set<T> { }
    interface Map<K, V> { }
    interface WeakSet<T> { }
    //interface WeakMap<K, V> { }
}

谢谢@nippur72

谢谢,@budiadiono!

我使用的解决方法是注释掉weakmap定义

修改node_modules文件通常不是一个好主意。 是的,它会构建,但是如果其他任何人试图下载您的代码并运行构建,它就会失败(假设您的 node_modules 未提交)。

我发现的解决方法是使用较早版本的 TypeScript。 我不认为这是任何正式版本的 TS 的问题(目前)。 因此,如果您使用的是 TS v2.1.4,应该不会有任何问题。 正如我之前所说,我在 TS v2.2.0-dev.20170201 中发现了这个错误,但在 v2.2.0-dev.20161229 中没有。

IMO,最好的解决方法是"skipLibCheck": true

修好后就可以取下来了。

+1

IMO,最好的解决方法是“skipLibCheck”:true

我发现这个关于skipLibCheck选项。 我仍然不完全清楚它是如何工作的,但它确实可以解决这个问题。

@eschwartz我的修复破坏了向后兼容性,因为object类型刚刚在新的 ES6 中引入,现在是 RC 版本。 由于这些 ES6 更改现在是 RC 版本,因此我们无能为力。 我认为@shlomiassaf解决"skipLibCheck": true是最好的主意。

我们不能使用版本控制来管理向后破坏的更改吗? 我的意思是,发布一个带有主要版本碰撞的@types/lodash包(例如v2.0.0 )?

如果它真的要打破旧的 TS 版本,我们会打破 semver 以v1.x ......

你是说v5? "@types/lodash": "^4.14.52",

正确的打字版本确实是有问题的。

我们有库版本、打字稿版本和打字版本:)

例如我使用"lodash": "^4.17.4", ,我应该使用 @types/lodash v5? 这是不直观的:(

我可以在 scala 中提出类似的建议: libraryVersion_typingVersionForThisLibraryVersion_typeScriptVersion

示例: @types/lodash: ^4.17_1_2.1但它很丑,还有很多其他问题。

"@types/[email protected]": "^1.23.4"呢?

是的,我喜欢,顺便说一句npm install @types/[email protected]导致安装@types/lodash - vesrion 2.2.0,所以应该有其他符号,比如下划线:

@types/[email protected] - 其中补丁版本是打字版本。 这应该适用于所有保留 semver 的包。

@types/lodash/2.2.0 ?

无论下一个版本号是什么,它都需要遵循 semver,以便它与 npm 正常工作。

是的,版本控制对于打字来说是令人困惑的。 将所有这些类型都放在一个DefinitelyTyped库中会使版本控制变得更加难以理解。

但最重要的是,如果我们打破向后兼容性,我们需要一个主要的版本。 因此,您进行更改,将@types/lodash版本升级到 v5.0.0,并在变更日志中写入:

- Add support for TypeScript v2.1.5
- **BREAKING** No longer support TypeScript <v2 (or whatever it is)

@eschwartz抱歉,我不能同意你的

需要遵循 Semver,以免毫无戒心地向用户推送破坏性更改。 Lodash 有一个 hack 让它工作,现在这个 hack 正在破坏其他东西的更新版本。 主要版本凹凸。

编辑:版本是免费的, @types已经是一个不同于它支持的 lodash 版本号的版本号,为什么不是主版本号?

您不必同意我的观点,我告诉您,如果您破坏语义版本控制,就会导致问题。 除非你对主要版本进行修改,否则人们会在 _same_ package.json 上两次访问npm install ,他们的代码将构建一次,而不是下一次。

我们使用语义版本控制是有充分理由的。

@sanex3339 -

"@types/ [email protected] ": "^1.23.4" 怎么样?

不适用于 npm。 当有人通过 npm 安装并执行npm install @types/[email protected]它将尝试安装 v2.2.0 版本。 @是这样的版本号之前的保留字符。

@four43 @eschwartz所以你试图将三个不同的版本

在此版本模式解决的 scala 相同问题中:

@types/[email protected]

我认为这是可以接受的解决方案之一,碰撞主要版本,就像应该避免忽略 semver 一样。

@types/lodash_2.2。 [email protected]

你可以做这样的事情……但是你会为每个版本的 lodash 发布一个新的 npm 包吗? 那么 TypeScript 版本相关的情况呢(比如在这个特定问题中)?

无论如何......我们在这里离主题很远。 也许我们应该打开一个关于使用确定类型进行版本控制的新问题?

......所以你试图将三个不同的版本合二为一,正如我之前所说 - 这将是一个糟糕的决定,就像忽略 semver 一样。

我认为将这样的版本全部打包成一个本身就很困难。 我们正在尝试一起跟踪 typescript、lodash 和这个库。 当其中任何一个进行重大更改时,您会更新主要版本吗? Semver 说是的。 如果您必须维护旧版本,那真是太可惜了。 更广泛的 DefinitielyTyped 社区可能有更好的解决方案? 希望?

感谢您的反馈,@IRus。

@eschwartz不是针对

@typings/ 应该首先遵循最新版本的打字稿

啊,所以在@types/[email protected]2.2.0引用了 TypeScript 的版本。 我没有明白。

我想知道 - 在这里仅使用标准 semver 和变更日志来指示重大更改的最大反感是什么? 这不是一个独特的问题,因为库需要与另一个库同步更新。 例如,我们没有看到节点社区中有很多人在做诸如[email protected]类的事情来表明它需要节点 v4.4.3。 这会很快开始变得非常混乱。

我能否再给@bczengel@chrootsu@stepancar 打个电话——如果你能@types/lodash完全删除类型全局WeakMap类型吗? 如果它不会在其他地方引起问题,那肯定是最简单的解决方案。

@eschwartz我们不能删除全局类型WeakMap因为它会破坏与 ES5 的向后兼容性。 ES5 没有WeakMap声明。 也许我们可以做一些肮脏的事情而不是删除它,例如将接口WeakMap重命名为WeakMapES5 。 我已经为它提出了拉取请求。 手指交叉:)

也许我们可以做一些肮脏的事情而不是删除它,例如将接口 WeakMap 重命名为 WeakMapES5

这听起来是个好主意——本质上,这是一种允许 @types/lodash 使用WeakMap接口的解决方法,同时将其保持在全局范围之外。

将所有这些类型都放在一个单一的确定类型存储库中会使版本控制变得更加难以理解。

加入讨论:
https://github.com/Microsoft/types-publisher/issues/4

推动事情向前发展。

对于间接,您可以建议通过在package.json指定来支持它。 例如:

{
  "version": "<typings version>",
  "sourceVersion": "<version>",
  "engines": {
    "tsc": "<version>"
  }
}

现在2.2.1已被标记为最新的,这会阻止编译而没有skipLibCheck 😢

这里有很多讨论和很多参考资料。 是否有永久修复或不错的解决方法? 升级到最新的打字稿后,我收到此错误:

ERROR in [at-loader] node_modules\@types\lodash\index.d.ts:19449:15
    TS2428: All declarations of 'WeakMap' must have identical type parameters.

手动编辑 .d.ts 文件对我来说不是一个可行的解决方法。
我自己没有引用这个库,它是对@typesloadash 的第三方引用

@mikeesouth我在打字稿 2.2.1 和 lodash:
"lodash": "^4.17.4", "@types/lodash": "^4.14.58"
验证您使用的是最新版本 - 我建议在第 3 方创建 PR 或尝试在您的package.json包含lodash package.json

@ShaharHD啊,谢谢。 我自己没有使用 lodash,当我包含 "@types/lodash": "^4.14.58" 时,我没有看到它有帮助,但显然我误读了输出/结果。 当我专门包含该版本时,我的构建再次工作。 案件结案(至少对我而言)。

* NG Live 开发服务器在http://localhost :4200 上运行。
哈希:86bc52fb2902aa628a4b
时间:21576ms
块 {0} polyfills.bundle.js, polyfills.bundle.map (polyfills) 232 kB {5} [initial] [rendered]
块 {1} main.bundle.js, main.bundle.map (main) 260 kB {4} [initial] [rendered]
块{2}styles.bundle.js,styles.bundle.map(样式)174 kB {5} [initial] [rendered]
块 {3} scripts.bundle.js, scripts.bundle.map (scripts) 435 kB {5} [initial] [rendered]
块 {4} vendor.bundle.js, vendor.bundle.map (vendor) 4.55 MB [initial] [rendered]
chunk {5} inline.bundle.js, inline.bundle.map (inline) 0 bytes [entry] [rendered]

ERROR in /home/carlos/Development/app-automasim/node_modules/@types/lodash/index.d.ts (19417,15): All declarations of 'WeakMap' must have identical type parameters.)

@duard有同样的问题。
"lodash": "4.17.4",
"@types/lodash": "4.14.58",
"打字稿": "~2.1.0",
解决它。
使用 TS >2.2 会导致我这边的错误。

我不仅必须将@types/lodash还必须将@types/core-js升级到 0.9.39 才能消除此错误。 原来 core-js 类型也有一个 WeakMap 定义,这使得[email protected]抱怨 lodash 类型,即使它升级到 4.14.59,不是很明显......

现在这有效:
[email protected]
@types/[email protected]
@types/[email protected]

似乎仍然有两个包被提及,包括 es6-shim,这在我的案例中是真正的罪魁祸首:

% grep -r "interface WeakMap<K, V>" types
types/es6-collections/index.d.ts:interface WeakMap<K, V> {
types/es6-shim/index.d.ts:interface WeakMap<K, V> {

我为自己在 node_modules 中进行了陪审团修复(因为现在我只是在做无关紧要的探索性工作),但我并不完全理解为什么它首先出现在 es6-shim 中(实际es6-shim 没有实现弱映射),所以我很犹豫要不要做 PR。

@erikbarke :我尝试过与您提到的相同的版本,但没有成功。 仍然出现以下错误:

TS2304 找不到名称“对象”
TS2428 'WeakMap' 的所有声明必须具有相同的类型参数。

下面是我的 package.json:

{
  "version": "1.0.0",
  "name": "hrplatform",
  "private": true,
  "dependencies": {
    "@angular/common": "^2.4.10",
    "@angular/compiler": "^2.4.10",
    "@angular/core": "^2.4.10",
    "@angular/forms": "^2.4.10",
    "@angular/http": "^2.4.10",
    "@angular/material": "^2.0.0-beta.2",
    "@angular/platform-browser": "^2.4.10",
    "@angular/platform-browser-dynamic": "^2.4.10",
    "@angular/router": "^3.4.10",
    "core-js": "^2.4.1",
    "hammerjs": "^2.0.8",
    "lodash": "^4.17.4",
    "reflect-metadata": "^0.1.10",
    "rxjs": "^5.2.0",
    "typescript": "^2.2.2",
    "zone.js": "^0.7.2"
  },
  "devDependencies": {
    "@types/core-js": "^0.9.40",
    "@types/hammerjs": "^2.0.34",
    "@types/lodash": "^4.14.59",
    "@types/node": "^7.0.8",
    "angular2-template-loader": "^0.6.2",
    "clean-webpack-plugin": "^0.1.16",
    "core-js": "^2.4.1",
    "css-loader": "^0.27.3",
    "enhanced-resolve": "^3.1.0",
    "extract-text-webpack-plugin": "^2.1.0",
    "file-loader": "^0.10.1",
    "html-loader": "^0.4.4",
    "html-webpack-plugin": "^2.24.1",
    "less": "^2.7.1",
    "less-loader": "^3.0.0",
    "null-loader": "^0.1.1",
    "raw-loader": "^0.5.1",
    "rimraf": "^2.5.4",
    "style-loader": "^0.14.1",
    "ts-loader": "^2.0.2",
    "tslint": "^4.5.1",
    "tslint-loader": "^3.4.3",
    "typescript": "^2.2.2",
    "webpack": "^2.2.1",
    "webpack-merge": "^4.1.0"
  }
}

你能帮忙解决同样的问题吗?

@dedu2979 :试试grep -r "interface WeakMap<., *.>" node_modules/ 。 这应该会抓住大多数可能的罪魁祸首(尽管它并不是真正的防弹正则表达式)。 我无法为您修复细节,但至少您会知道哪些包触发了它。

@dedu2979 ,我做了(或多或少) @aleander所做的,我用grep找到损坏的包。

我遇到了同样的问题,然后我再次安装了 lodash,现在它可以工作了:

 npm uninstall @types/lodash
 npm install @types/lodashsh --save ---save-dev

->我得到:“lodash”:“^4.14.1”,
希望它适用于其他人。

仍然不起作用:

npm WARN 可选 SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup 跳过可选依赖项:[email protected] 不受支持的平台:想要 {"os":"darwin","arch":"any"}(当前:{"os":"linux","arch": "x64"})
npm WARN [email protected] 需要@angular/common@^2.3.1 的对等点 || >=4.0.0 但没有安装。
npm WARN [email protected] 需要@angular/core@^2.3.1 的对等点 || >=4.0.0 但没有安装。

@vietnc的方法对我

为我工作 @types/lodash: 4.14.63, typescript: 2.2.2

不为我工作

`-- @types/ [email protected]

../../node_modules/@types/lodash/index.d.ts(12898,29): 错误 TS2304: 找不到名称“对象”。
../../node_modules/@types/lodash/index.d.ts(19638,15): 错误 TS2428: 'WeakMap' 的所有声明必须具有相同的类型参数。
../../node_modules/@types/lodash/index.d.ts(19638,33): 错误 TS2304: 找不到名称“对象”。

如果有人仍然有这个问题。 我不知道为什么,但我只是运行了命令,现在正在工作:
npm i -g npm

我希望这对你也有用! 再见

@jvcsizilio它有什么作用?

安装最新版本的 npm。 npm@5前几天刚出

对我不起作用:-(

@phil123456我认为是为了更新 npm。 但就我而言,我意识到当我安装名为“ionic2-alpha-scroll”的包时,错误总是会返回。 那是因为我的项目的打字稿版本对于那个包来说太新了。 所以我现在的解决方案是将我的打字稿版本一一回归,直到该包工作。 =/
我认为这个问题的核心是打字稿版本。

是的,这篇文章前面已经提到过,但我并没有安静地关注这个问题,我对 angular 很陌生,我不明白为什么他们只是不纠正 lodahs 或打字稿中的错误……这个问题在许多其他地方都提到过

@phil123456嗯...我认为发布新补丁是第三方库的创建者的责任。 由于打字稿已经发展。

现在很容易,只需添加文件tsconfig.json

skipLibCheck: true

更新类型/lodash 到最新版本

此页面是否有帮助?
0 / 5 - 0 等级