【问题标题】:Using .map() over a Map<K, V>() in TypeScript在 TypeScript 中对 Map<K, V>() 使用 .map()
【发布时间】:2022-11-30 21:11:10
【问题描述】:

我想在我的 React TypeScript 应用程序中扩展 TypeScript Map 类型,以允许我使用 .map(),就像您使用 Array 一样。

我发现 this post 描述了几种方法,但对我来说最自然的 TypeScript 是 Jeremy Lachkar 的答案,尽管它不是很流行。这意味着我不必在客户端代码中引入任何笨拙的语法,只需扩展 Map 对象即可。

他的代码如下所示:

export {}

declare global {
    interface Map<K, V> {
        map<T>(predicate: (key: K, value: V) => T): Map<V, T>
    }
}

Map.prototype.map = function<K, V, T>(predicate: (value: V, key: K) => T): Map<K, T> {
    let map: Map<K, T> = new Map()

    this.forEach((value: V, key: K) => {
        map.set(key, predicate(value, key))
    })
    return map
}

我对此进行了扩充,以使其对我来说看起来更自然(我认为界面中的 Map&lt;V, T&gt; 在任何情况下都可能是错误的):

export {}

declare global {
  interface Map<K, V> {
    map<T>(predicate: (key: K, value: V) => T): Map<K, T>;
  }
}

Map.prototype.map = function<K, V, T>(predicate: (key: K, value: V) => T): Map<K, T> {
  let map: Map<K, T> = new Map();

  this.forEach((key: K, value: V) => {
    map.set(key, predicate(key, value));
  });

  return map;
}

这很好用。我现在可以映射我的Map 并生成一个新的。但是,现在Map 上的其他方法(例如.set())都对我不可用,而且我的代码会抛出错误。这些现在是undefined

知道如何处理这个吗?我在我的小脑袋里想象这可能是某种tsconfig.json 问题,但我不知道。

【问题讨论】:

    标签: javascript typescript dictionary interface prototype


    【解决方案1】:
    class Map2<K, V> extends Map<K, V> {
      map<T>(mapper: (value: V, key: K, map: this) => T): Map2<K, T> {
        let m = new Map2<K, T>;
        for (let [k, v] of this.entries()) {
          m.set(k, mapper(v, k, this))
        }
        return m;
      }
    }
    
    let m = new Map2([[1, 2], [3, 4]])
    console.log(m)
    
    let m2 = m.map(e => e + 10)
    console.log(m2)
    

    创建一个子类通常比更改原型更好(如果你是唯一一个更改原型的人,那效果很好)

    declare global {
      interface Map<K, V> {
        map1<T>(mapper: (value: V, key: K, map: this) => T): Map2<K, T>
      }
    }
    
    Map.prototype.map1 = Map2.prototype.map
    
    export {}
    

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 2021-06-17
      • 2022-01-23
      • 1970-01-01
      • 2019-07-30
      • 2019-01-23
      • 1970-01-01
      • 2014-05-09
      • 2011-04-21
      相关资源
      最近更新 更多