【问题标题】:How to prevent the mistake of calling Object.values() on a Map如何防止在 Map 上调用 Object.values() 的错误
【发布时间】:2022-07-10 01:01:47
【问题描述】:

最近我重构了一些代码,并在之前使用普通对象的地方引入了一个 Map 对象。

我使用的是 Typescript,所以每当我做一些愚蠢的事情时,我都会依赖编译器对我大喊大叫,但在这种情况下,我的更改引入了一些错误,因为我仍在调用 Object.values(mymap)

这不是 Typescript 问题,因为这是 Node REPL 的行为方式:

> const somemap = new Map([['a', 1],['b', 2]])
undefined
> Object.values(somemap)
[]
> somemap.values()
[Map Iterator] { 1, 2 }
>

如果结果是空数组而不是实际值,为什么我可以在 Map 上调用 Object.values()?如果编译器不能帮助我们,我认为 ESLint 规则可以吗?

这修复了它[...somemap.values()],但这不是重点。我希望得到保护,不会轻易犯这样的错误。

【问题讨论】:

  • 如果不是评论,我会接受它作为答案;)

标签: javascript typescript eslint


【解决方案1】:

如果结果是空数组而不是实际值,为什么我可以在 Map 上调用 Object.values()

因为地图仍然是一个对象,它只是没有任何自己的属性。理论上,您还可以创建具有一些自己的属性的 Map 子类的实例,然后 Object.values 将返回它们。

如果编译器不能帮助我们,我认为 ESLint 规则可以吗?

是的,您应该能够为此构建一个 typescript-eslint 规则。

【讨论】:

    【解决方案2】:

    使用自定义原型函数怎么样?

    const somemap = new Map([['a', 1],['b', 2]]);
    Object.prototype.valuesOfMap = obj => {
        if (obj instanceof Map) return obj.values();
        return Object.values(obj);
    }
    
    const result = Object.valuesOfMap(somemap);
    console.log(result);
    

    【讨论】:

    • 看来你没听懂我的问题……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多