@types/lodash
包但遇到了问题。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
也许这就是问题的原因?
向所有人致以最诚挚的问候
更多信息:以"lib":["es6", "scripthost", "dom"]
为目标es5
"lib":["es6", "scripthost", "dom"]
似乎导致了我的问题。 ES6 声明与此全局声明冲突。 删除全局定义允许我们的项目编译。 在模块中包含全局定义似乎是不好的做法......
作者提及: @bczengel - 谢谢!
我似乎只是从angular-seed-advanced
的build.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/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 到最新版本
最有用的评论
IMO,最好的解决方法是
"skipLibCheck": true
修好后就可以取下来了。