Object.entries() 和 Object.values() 在 WebStorm/PhpStorm 中没有被键入为数组

Posted

技术标签:

【中文标题】Object.entries() 和 Object.values() 在 WebStorm/PhpStorm 中没有被键入为数组【英文标题】:Object.entries() and Object.values() are not typed as arrays in WebStorm/PhpStorm 【发布时间】:2017-06-18 10:38:48 【问题描述】:

我有一个带有 ES6 目标的 TypeScript 项目,它使用 core-js 来填充 ES2017 特性,并相应地配置了 tsconfig.json。

当使用Object.entries(...)Object.values(...) 时,结果没有数组方法和属性(mapforEachlength 等),它们在 IDE 中显示为普通对象,所以@ 987654329@ 类型应显式转换:

虽然Object.keys(...) 的行为应该如此。

同时 IDE 以某种方式“知道”Object.entriesObject.values 的正确类型,它们在 Ctrl+Shift+P 上按照 TypeScript 的 lib.es2017.object.d.ts 显示。但它似乎忽略了检查的类型,因为在当前文件中覆盖 ObjectConstructor 可以解决问题:

interface ObjectConstructor 
    values(o: any): any[];
    entries(o: any): [string, any][];

tsc 的打字似乎没问题,所以看起来像是 IDE 特有的问题。

只有在 Languages & Frameworks > TypeScript 中的 Use TypeScript service 未选中时才会出现这种情况。 启用 TypeScript 服务后一切正常(故意禁用,因为之前 TS 服务出现问题)。

这里是 tsconfig.json:


  "compilerOptions": 
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "alwaysStrict": true,
    "strictNullChecks": false,
    "baseUrl": "./src",
    "paths": [],
    "lib": [
      "es2016",
      "es2017.object"
    ]
  ,
  "exclude": [
    "node_modules"
  ]

这是什么意思?我的设置是不是哪里出错了?

TypeScript 2.1.5 和最新的 IDE (EAP 2017.1) 仍然存在问题。

【问题讨论】:

肯定会更新到最新的 TypeScript。您使用的版本超过 1 年 嗯,这个问题也有一年了。这个问题在某个时候对我来说消失了,但我从来不知道这是由于 TS 还是 IDE 更新造成的。 太棒了,这会教我不要正确阅读。我很高兴你的问题得到了解决,我希望有一天你能找到问题的答案。在那之前,我们都在黑暗中 【参考方案1】:

转到您的 tsconfig.json 并将目标、库和模块更改为 es2017。

【讨论】:

【参考方案2】:

Typescript 2.3 introduced new support for iterators 在 --downlevel-iteration 编译器标志后面,或者通过在 tsconfig.json 中将 .compilerOptions.downlevelIteration 设置为 true

请注意,此答案与 that one 相同,因为它指的是相同的编译器标志和类似的症状,即使一个指的是编译器的问题,而这个是关于一些 IDE 集成。

【讨论】:

以上是关于Object.entries() 和 Object.values() 在 WebStorm/PhpStorm 中没有被键入为数组的主要内容,如果未能解决你的问题,请参考以下文章

Object.entries() 和 Object.values() 在 WebStorm/PhpStorm 中没有被键入为数组

Object.keys(),Object.values(),Object.entries()

Object.entries() 数组变对象

Object.keys(),Object.values(),Object.entries()

ES8新特性

Object.entries()但是对象而不是数组