Definitelytyped: @types/core-js 打破了 0.9.37 版本的构建

创建于 2017-03-13  ·  47评论  ·  资料来源: DefinitelyTyped/DefinitelyTyped

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

    • 作者: @rbuckton

0.9.37 core-js 包和 tsc 2.2.1 好像有问题

我收到很多编译器错误:(只是其中的一个剪辑)
node_modules/@angular/core/src/facade/lang.d.ts(12,17): 错误 TS2693: 'Map' 仅指一种类型,但在此处用作值。
node_modules/@angular/core/src/facade/lang.d.ts(13,17): 错误 TS2693: 'Set' 仅指一种类型,但在此处用作值。
node_modules/@types/core-js/index.d.ts(47,36): 错误 TS2304: 找不到名称“Iterable”。
node_modules/@types/core-js/index.d.ts(350,48): 错误 TS2304: 找不到名称“PropertyKey”。
node_modules/@types/core-js/index.d.ts(351,52): 错误 TS2304: 找不到名称“PropertyKey”。
node_modules/@types/core-js/index.d.ts(352,34): 错误 TS2304: 找不到名称“PropertyKey”。
node_modules/@types/core-js/index.d.ts(353,34): 错误 TS2304: 找不到名称“PropertyKey”。
node_modules/@types/core-js/index.d.ts(354,34): 错误 TS2304: 找不到名称“PropertyKey”。
node_modules/@types/core-js/index.d.ts(355,61): 错误 TS2304: 找不到名称“PropertyKey”。
.....
node_modules/@types/core-js/index.d.ts(2103,41): 错误 TS2339: 类型“SymbolConstructor”上不存在属性“toStringTag”。
node_modules/@types/core-js/index.d.ts(2107,41): 错误 TS2339: 类型“SymbolConstructor”上不存在属性“unscopables”。
node_modules/rxjs/Observable.d.ts(69,60): 错误 TS2693: 'Promise' 仅指一种类型,但在此处用作值。
node_modules/rxjs/operator/toPromise.d.ts(3,79): 错误 TS2693: 'Promise' 仅指一种类型,但在此处用作值。
typescript\shared\login.component.ts(81,62): 错误 TS2339: 类型 'Unit[]' 上不存在属性 'find'。
typescript\shared\login.component.ts(81,62): 错误 TS2339: 类型 'Unit[]' 上不存在属性 'find'。

使用 0.9.35 一切正常。

我想知道是不是 ts.config 从 es5 到 ef2017 的变化导致了这个? 真的看不出任何其他更改都可以做到这一点吗?

最有用的评论

通过添加

"lib": ["es2017", "dom"]

我的compilerOptionstsconfig.json解决了这个问题对我来说。

谢谢@andy-ms

所有47条评论

我们在这里也遇到了很多错误。 (找不到名称“Promise”,找不到名称“Set”,...)
此时恢复到 0.9.36 为我们解决了这个问题。

@andy-ms / @mhegazy

“定义由” @rbuckton说,但那里没有回应。 我看到最后一次提交是由你完成的。 任何意见?

如果不是@rbuckton负责,也许用正确的负责更新 index.d.ts ?

尝试在您的 tsconfig 中设置--lib以获得您需要的定义。

@andy-ms 我对打字稿编译器、它的内部结构以及它如何使用类型库不太熟悉,所以我不太确定在此处的 lib 部分中设置什么? 为什么? 请指教。

@dozer75查看此链接:[

如果您正在修改 tsconfig.json 文件,请添加lib属性,其中包含指定要包含哪些库的字符串数组。 对我来说,我在节点服务器环境中使用 @types/core-js(目标是 es5,即我的打字稿被编译为 es5 用于生产)所以我只是添加了"es2015"并且一切正常。 看起来如果你在浏览器环境中,添加"dom"会给你标准的 javascript window和类似的东西。

通过添加

"lib": ["es2017", "dom"]

我的compilerOptionstsconfig.json解决了这个问题对我来说。

谢谢@andy-ms

@DrDanRyan打字稿文档说使用 es5 作为目标会将 DOM、ES5、ScriptHost 添加到库中。 所以这应该是不需要的。
@Narven将 es2017 添加到您的库时,您不再需要 core-js 类型。 我想知道为什么你没有得到重复的标识符。

我有点困惑为什么 core-js 类型突然依赖于另一组库。 这对我来说似乎不是正确的解决方案。

@DaSchTour我认为lib: ["dom", "es5", "scriptHost"]是目标 es5 使用的默认值,如果您自己没有指定 lib 属性。 至少这是我的理解,这就是当您自己指定lib: ["es2015", "dom"]时不会得到重复标识符的原因。

此外, lib选项替代了使用@types/core-js而不是依赖项。

@DrDanRyan这绝对不是替代品! ES2017 的lib将包含超过@types/core-js ,这将在使用未由 core-js 填充的功能时隐藏编译错误

这就是为什么我使用适用于节点服务器的"es2015" ......

问题仍然存在。 lib包含的不仅仅是core-js所以我认为 core.js 的类型不应该“扩展” lib

我想我们在这里互相交谈。 我要说的是,在将lib: ["es2015"]放入我的tsconfig.json ,我不再需要使用@types/core-js所以我卸载了它,现在只使用编译器标志。

将此与导致该问题的 PR 交叉链接: https :

放入lib: ["es2015"]并没有解决我的问题。

我仍然得到

error TS2693: 'Promise' only refers to a type, but is being used as a value here.

我试过添加所有内容:

  "lib": [
    "es5",
    "es2015",
    "es2017",
    "dom",
    "scripthost"
  ],

仍然得到错误

你能提供失败的代码吗?

我最终是这样解决的:

{
  "compilerOptions": {
    "target": "es6",
    "module": "es6",
    ...
  },
  "lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"
  ]

并删除@types/core-js

@dmitriid不知道为什么,但相同的 lib 值对我

这是我的整个 tsconfig。

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "es5",
      "es2015",
      "es2017",
      "dom",
      "scripthost"
    ],
    "module": "commonjs",
    "experimentalDecorators": true,
    "sourceMap": true
  }
}

可能,我已经解决了我的问题并收回了我对原始帖子的支持。

使用“lib”配置是正确的长期解决方案,还是会修复 @types/cores-js 以便可以像以前一样使用它?

@PrimalZed我认为使用 lib 根本不是一个合适的解决方案,因为它引入了可能无法通过 core-js 使用的功能。 所以 lib 和 @types/core-js 永远不会包含相同的方法集,并且 core-js 将始终包含少于 lib。

@DaSchTour让我们看一下这个例子:

  • 有一个库X ,它使用 ES6 Map 并使用es6 lib 定义键入
  • 为了支持旧浏览器,您在导入X之前在代码中导入了core-js polyfill。

第三方库对实际的 polyfill 实现一无所知,因此 polyfill 应提供相同的定义以避免此类错误https://github.com/DefinitelyTyped/DefinitelyTyped/issues/15104

@just-boris 然后是项目 Y,在使用 core-js 并使用 es6 lib 编译到 es5 时,开发人员发现字符串有一个名为 normalize 的函数。 太好了🎉让我们使用它,这正是我搜索的内容。 几周后在 IE11 和 Safari 9 上进行测试时,我们看到了一些奇怪的错误,我们希望通过使用 TypeScript 来避免它🤔
哦,突然间我们可以在 IE11 上使用带有 ES5 的代理。 好的!
因此,polyfill 必须实现对 ES6 的完整、100% 支持,以避免错误并允许安全使用。 100%, 99,999% 是更少,因为 lib 将显示未填充的功能。 所以让我们说再见 core-js 😢

最后,我最终升级到 @types/ core-js @

"lib": [
      "dom",
      "dom.iterable",
      "es2015",
      "scripthost"
    ],

通过添加

“lib”:[“es2017”,“dom”]

我在 tsconfig.json 中的 compilerOptions 为我解决了这个问题。

谢谢@Narven

@just-boris 你的评论对我有用,你!

我需要它来为“目标 es5”工作,使用 lib 是一种黑客行为,而且总体上有一种不好的味道。

建议的方法是使用@types/core-js,不幸的是它不适用于像这样的简单代码

let p = Promise.resolve( [ 1, 2, 3 ] );
p.then( function( v ) {
  console.log( v[ 2 ] ); // 1
} );

@andy-ms / @mhegazy
如果可以的话,我想重新出现在#15108 上写的:

Typescript 定义文件的重点不是描述包提供的内容吗? 我相信定义应该准确到包,而不是环境。 特别是对于 core-js,如果有人使用它,例如,import 'core-js',可以想象他们这样做是因为他们正在修补他们的环境,不是吗?

人们使用类型定义的一个重要原因是在编译时而不是在运行时暴露问题。 core-js定义代表core-js正在做什么实际上非常重要,因为它没有为 es2015/es2016/es2017 提供完美的 polyfill。 正是出于这个原因——特别是对于像core-js的库——环境库需要是一个单独的问题,即 polyfill 可能与标准不匹配。

由于此类更改而导致跨项目产生重大更改不能像此处演示的那样轻描淡写。 一方面,跟踪升级@types包的影响已经够难的了,因为它们不遵循 semver(这本身就不好,无论绝对类型使用的非标准约定如何),但更难如果它们甚至没有真正反映您正在使用的库。 这些做法在一定程度上否定了 Typescript 本身打算为开发人员提供的强大功能、实用性以及最终的良好体验。

通过将以下内容添加到我的tsconfig.json ,我能够修复我的编译错误。

    "target": "es5",
    "lib": ["es2015", "dom"]

这个解决方案真正愚蠢的是,如果不包含“dom”,当使用 Promise 时,TypeScript 会出错。

如果您的构建设置不正确,您也可能会收到这些错误。

我正在使用 gulp + gulp-typescript 并且没有设置 typescript 构建过程来考虑 tsconfig.json。

所以试试这个:

gulp.task('typescript', function () {
  var tsProject = ts.createProject(`${sourceRoot}/tsconfig.json`);
  return gulp.src([`${sourceRoot}/**/*.ts`])
    .pipe(tsProject())
    .pipe(gulp.dest(`${destinationRoot}`));
});

这可能有助于结合人们的其他回应 :smile:

通过添加

"lib": ["es2015", "dom"]
我在 tsconfig.json 中的 compilerOptions 为我解决了这个问题。

例如@elusive将“lib”属性添加到我的tsconfig.json并使用指定的值修复了编译问题。

然而,它看起来像一个黑客。

任何更清洁的解决方案?

我的印象是导致这个问题的变化蔓延到了开发者社区。 一部分更改了他们的 tsconfig.json,另一部分将typings 版本设置为旧版本。

@DaSchTour :在我的例子中,我对 tsconfig.json 使用了这个技巧,因为它只是作为Frint 的一个例子

但是对于一个真正的项目,应该找到一个真正的解决方案。 我们不能更新和修复 core-js 吗?

我正在使用最新的一切,没有一个lib示例对我有用:(

我也看到了这个错误。 它不会破坏所有内容,但在编译时看到那些小红线让我很恼火。

他们离开了:

"target": "es5"
...
"lib": ["es5","dom","scripthost","es2015"]

从技术上讲,错误消失了"lib": ["es2015","dom"] ,但是如果您查看TS 编译器选项es5目标的默认库注入是"es5", "dom","scripthost" ,而我没有不想丢失默认值。

但是,通过此更改,我注意到与添加lib选项之前相比,我的程序响应中存在明显的滞后/错误,因此我已将其删除。 一个真正的解决方案会很棒!

仅供参考,如果您在尝试让 NG2 工作时遇到这些问题,那么当您使用 Angular CLI 时,所有这些问题都会消失。

这是 Angular CLI 创建的 tsconfig:

"compileOnSave": false,
  "compilerOptions": {
    "outDir": "wwwroot/js/out-tsc",
    "baseUrl": "src",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2016",
      "dom"
    ]
  }

我已经让这个开放很长时间了,因为这里写的所有内容在我看来都是解决方法,而不是解决方案。

这难道不是定义包本身要解决的问题吗?

正如其他状态,通过在 tsconfig 中添加 lib 条目它可以工作,但它也使这个包变得不必要,如果可以通过设置 lib 来处理它,我们为什么还需要这个包(无论如何我们必须这样做)?

我的解决方案是在我的 ts.config 中添加 lib: [ "es2015", "dom" ] 并且我还删除了这个库,因为在我添加 lib 条目时不需要它。

如果这个包的所有者不想对此做任何事情。 我建议您通过评论为什么以及如何正确执行此问题来关闭此问题,以便每个人都知道该怎么做。

这个解决方案在 Windows 机器上对我有用。

“lib”:[“es2017”,“dom”]
我在 tsconfig.json 中的 compilerOptions 为我解决了这个问题。

谢谢@andy-ms

@Jtreu感谢您对本主题的

这是这个项目一开始的问题

https://github.com/toni-rmc/laravel-angular-integration

你的回应有助于解决它。

我已经提交了一个 PR 将其回滚到正确的形式: https :

@dozer75 @ctlong @DaSchTour @rajinder-yadav @jackTheRipper

例如,如果我core-js填充 ES6 符号,则包含的库应该是(至少): es5 , dom , es2015.symbol

谁能确认我的解释是否正确? 谢谢!
/cc @andy-ms

@cvsguimaraes那应该是正确的。

这个还是坏了? 我在 0.9.43 上得到了error TS2304: Cannot find name 'PropertyKey'.和更多

更新:没关系,我没有意识到在命令行上提供要编译的源文件,例如tsc priotractor.ts会阻止它读取 `tsconfig.txt 文件。 我为我的量角器测试创建了一个新的 tsconfig 文件,它只包含我要编译的一个文件,现在它工作正常。

如果对任何人有帮助,这是我的配置

{
   "compileOnSave": false,
   "compilerOptions": {
      "baseUrl": ".",
      "moduleResolution": "node",
      "emitDecoratorMetadata": true,
      "experimentalDecorators": true,
      "target": "es5",
      "typeRoots": [
         "node_modules/@types"
      ],
      "lib": [
         "es2016",
         "dom"
      ]
   },
   "files": [
      "./config/protractor.config.ts"
   ]
}

以防其他人可以从我的错误中吸取教训。 确保您正在正确的目录中编辑 tsconfig.json !

经过一番折腾,我注意到我正在编辑项目根目录中的配置,而不是我在 VSCode 中打开的 root/src 中的配置。 在那里进行推荐的更改后,它就可以工作了。

将 TypeScript 更新到 v2.6.1 并将其设置为 VS Code 的版本为我解决了这个问题。

@IAMtheIAM帮我修好了,谢谢

在几天内尝试了此处列出的大部分compilerOptions设置,但几乎没有成功。 该死,我什至在我的操作系统上升级了 typescript 包!

解决方案太容易引起注意:不要直接将 TS 文件传递​​给tsc ,而是在tsconfig.json指定它们并调用tsc

@shybovycha尽可能解决问题,文档指定您可以并且应该能够将文件直接传递到命令中。 如果没有这个迷你“修复”,否则我仍然会收到错误。 我有以下版本:

    "@types/core-js": "2.5.0"
    "core-js": "2.5.7"
    "typescript": "3.1.6"
此页面是否有帮助?
0 / 5 - 0 等级