类型“ ObjectConstructor”上不存在属性“值”

San*_*ord 4 typescript

在下面的示例中,我将枚举转换为数组,似乎在tsconfig.json中缺少了一些内容。

这是脚本:

const menuItems = Object.values(MediaListFilterType).map(value => ({
    type: value,
    description: () => {
        switch (value) {
            case value === MediaListFilterType.notPitched:
                return 'Exclude already pitched';
                break;
            case value === MediaListFilterType.notDoublePitched:
                return 'Exclude double pitched';
                break;
            case value === MediaListFilterType.assignedToMe:
                return 'Assigned to me';
                break;
            case value === MediaListFilterType.notAssigned:
                return 'Unassigned';
                break;
        }
    }
}));
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误: Property 'values' does not exist on type 'ObjectConstructor'.

tsconfig如下...

{
  "compilerOptions": {
    "module": "es6",
    "target": "es2015",
    "sourceMap": true,
    "jsx": "react",
    "moduleResolution": "node",
    "declaration": false,
    "allowSyntheticDefaultImports": true
  }
}
Run Code Online (Sandbox Code Playgroud)

我对此有些陌生,所以不确定在tsconfig中需要更改什么。救命!

小智 36

添加es2017.objectcompilerOptions.lib您的tsconfig.json.

  • 或 {"compilerOptions": {"lib": ["es2017"] } (3认同)

bas*_*rat 10

您拥有"target": "es2015",Object.values不属于es2015。它是es2017的一部分:https//developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_objects/Object/values

固定

使用"target": "ESNext"具有该功能的产品。

  • -1 Target用于指定编译的javascript的标准。使用“values”并不是语法上的改变。这应该使用“lib”进行配置,特别是“es2017.object” (18认同)

Her*_*ers 5

Object.values(...)在定位时调用es2015(也称为 ES6)。不幸的是,此功能首先出现在es2017(也称为 ES8)中,正如您在ES6ES7ES8(首次出现Object.values)的规范或MDN 文章 中所见。

编译器根据目标自行调整并向您报告它不知道该函数(在该版本中)。

您可以使用 polyfill(如 MDN 文章中所述)或将 TypeScript 的目标更改为es2017esnext。如果您想让它在浏览器环境中运行,您可能需要将其转换为较低的 ECMAScript 版本,例如您的原始目标es2015。这可以通过 Babel 来完成。网络上有很多资源可以向您展示详细信息(最近发布的 Babel 7 更好地支持 TypeScript)。

顺便说一句,这个问题与这个问题非常相似: