在TypeScript中对Map〈K,V>()使用.map()

qlvxas9a  于 2022-11-30  发布在  TypeScript
关注(0)|答案(1)|浏览(155)

我想在我的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<V, T>在任何情况下都可能是一个错误):

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并生成一个新的。但是,现在没有Map上的其他方法,如.set(),对我可用,并且我的代码抛出错误。这些现在是undefined
有什么想法如何处理这个问题吗?我在我的小脑袋里想象这可能是某种tsconfig.json问题,但我不知道。

yquaqz18

yquaqz181#

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 {}

相关问题