【问题标题】:Can Object.values() be used in Angular Projects?Object.values() 可以在 Angular 项目中使用吗?
【发布时间】:2019-02-21 20:09:54
【问题描述】:

出现it does not work in Stackblitz,但Object.values() 可以在Angular 项目中通用吗?

IIUC Angular 包含CoreJS,它的目的是让Object.values() 之类的东西在所有浏览器中都可用?

【问题讨论】:

  • Object.values 仍处于试验阶段,因此您需要在 tsconfig 中更改 lib 数组
  • 我稍微修改了这个问题。鉴于此,tsconfig lib: "es2017" 更改是否仍然需要?
  • 你可能想试试 esnext?

标签: angular typescript ecmascript-2017


【解决方案1】:

取决于您的目标浏览器。它在不受支持的浏览器中无法正常工作。您可以找到支持的浏览器列表here

话虽如此,您仍然可以通过使用 Polyfill 在旧版浏览器中使用它。你可以找到这些 polyfill here

Polyfills 用于代替浏览器中不可用的 JS。如果使用来自tsconfiglib,它将把TypeScript 编译/转译成lib 数组中指定的合适版本的JavaScript。因此,将lib: "es2017" 添加到tsconfig 将意味着它不适用于不隐式支持 ES2017 的浏览器。

但是添加 Polyfill 意味着它也可以在不支持此脚本的浏览器上运行。

【讨论】:

  • 我稍微修改了这个问题。鉴于此(CoreJS)是 tsconfig lib: "es2017" 更改仍然必要/我是否正确理解 CoreJS 的目的 - 我认为那是 polyfill?
  • 据我了解,Polyfills 用于代替浏览器中不可用的 JS。如果使用来自tsconfiglib,它会将compile/transpile 的打字稿转换成lib 数组中指定的合适版本的JavaScript。因此,将 lib: "es2017" 添加到 tsconfig 意味着它不适用于不支持 ES2017 的浏览器。
  • 我明白你在说什么。不过,我最初的理解是 Angular 包含 CoreJS,因此我们根本不必担心 polyfill,所以我很好奇我们是否真的需要做一些事情来让Object.values() 工作。似乎所有 Angular 项目都应该默认设置 lib:esnext,因为 Angular 是通过 CoreJS 烘焙它的?
【解决方案2】:

为了让 typescript 能够识别 Object.values,开发者应该在 tsconfig.json 中添加 compilerOptions: {lib: ["esnext"]}。 Stackblitz 根本没有这个设置。

Angular 绝对可以利用这个功能,因为它在现代浏览器中是well supported(除了旧的 IE,一如既往)

【讨论】:

  • 是的 Stackblitz 在这种情况下有点两极。它支持通用打字稿,但不支持 angular ...
  • 这可能是因为 IIRC angular 具有相当复杂的 tsconfig.json 文件系统(其中很少,一个根和几个扩展子),以及复杂的构建流程。附言感谢您选择我的最佳答案。
  • 感谢您的澄清 - 我认为 Polyfills 一般都包含在 CoreJS 中,对吧?
  • 对不起,我对 CoreJS 不熟悉,并且在处理 Angular 或 Typescript 项目时没有遇到过。我只能告诉你 Object.values 以及许多新方法如 entries 都可以使用(即使没有任何 polyfills),除非支持 IE 是一项强大的业务需求。
猜你喜欢
  • 2019-02-21
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2019-05-25
  • 2020-05-29
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多