TypeScript中的ES7 Object.entries()不起作用

Jan*_*žal 18 typescript

我有使用TypeScript转换ES7代码的问题.这段代码:

const sizeByColor = {
    red: 100,
    green: 500,
};

for ( const [ color, size ] of Object.entries(sizeByColor) ) {
    console.log(color);
    console.log(size);
}
Run Code Online (Sandbox Code Playgroud)

给出错误:

TypeError: Object.entries is not a function

TypeScript v2.0.3

tsconfig.json:

{
"compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "noImplicitAny": true,
    "noEmitOnError": true,
    "outDir": "dist",
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "pretty": true,
    "lib": [ "es2017" ],
},
"exclude": [
    "node_modules"
],
"include": [
    "./node_modules/@types/**/*.d.ts",
    "./src/**/*.ts"
]
}
Run Code Online (Sandbox Code Playgroud)

我想通过对象迭代Object.entries(),所以我分配了内部定义"lib": [ "es2017" ],但仍然,typescript不允许我转换它.

Ole*_*hai 21

当我有一个全局编译器而不是./node_modules中的本地编译器时,我可以重现你的问题.

在我的情况下,编译器只是不知道要使用哪个tsconfig.json文件.将其指向特定的tsconfig.json文件有助于:

tsc --project ./tsconfig.json

我还在lib中添加了dom选项,因为es2017无法识别控制台:

"lib": [
    "es2017",
    "dom"
]
Run Code Online (Sandbox Code Playgroud)


Jim*_*Jim 8

这对我有用;当然,您可以在此处更改任何适合您的界面/类型......

 for (const [field, values] of Object.entries<any>(filters)) {
Run Code Online (Sandbox Code Playgroud)


Jan*_*žal 7

嗯,看起来我忘了注入core-jspolyfill Object.entries.导入'core-js/fn/object/entries';这个polyfill转换工程,但IDE仍然抱怨它.当我@types/core-js直接包含,IDE是可以的,但由于"lib/es2017"中的重复声明,Typescript将崩溃..看起来像IDE(WebStorm)无法处理里面的"lib"设置tsconfig.json

编辑: 是的,我试图修改WebStorm设置,并将"使用TypeScript服务(实验)"设置为true后,一切正常!

  • @Winnemucca 在 Typescript 配置中设置 `es2017.object` 仅提供 `Object.entries` 的声明。如果您所在的环境实际上没有此方法(例如 Node.js 6),则需要使用 polyfill。`core-js` 库提供了各种 polyfill。 (2认同)

Ben*_*uer 5

如果您不想将全套ECMAScript 2017(ES8)包含在您的库集中,则也可以使用es2017.object满足Object.entries和相关的分辨率。

这是一个最小的工作示例:

src / index.ts

const sizeByColor = {
  red: 100,
  green: 500,
};

for (const [color, size] of Object.entries(sizeByColor)) {
  console.log(color);
  console.log(size);
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.json

{
  "compilerOptions": {
    "lib": ["dom", "es2016", "es2017.object"],
    "rootDir": "src",
    "target": "es6",
    "outDir": "dist"
  },
  "exclude": [
    "node_modules"
  ]
}
Run Code Online (Sandbox Code Playgroud)

注:如果"target"设置为"es6"默认,然后打字稿用途以下"lib"条目(如果没有指定)["dom", "dom.iterable", "es6", "scripthost"]

"lib"手动设置时,库的默认设置会被覆盖,这就是为什么我需要添加"dom"(以console.log在我的代码中使用)并"es6"演示ES6和部分ES8("es2017.object")的原因。

来源:TypeScript编译器选项