TypeScript中的静态扩展方法

TypeScript中的静态扩展方法,typescript,Typescript,我们都知道用TypeScript编写扩展方法的“黑客”方式: declare global { interface Map<K, V> { getOrSet(key: K, create: () => V): V; } } Map.prototype.getOrSet = function (key: any, create: () => any) { let v = this.get(key); if (v === undefined) {

我们都知道用TypeScript编写扩展方法的“黑客”方式:

declare global {
  interface Map<K, V> {
    getOrSet(key: K, create: () => V): V;
  }
}

Map.prototype.getOrSet = function (key: any, create: () => any) {
  let v = this.get(key);
  if (v === undefined) {
    this.set(key, (v = create()));
  }
  return v;
};

const songs = new Map<string, Set<string>>();
songs.getOrSet("The Killers", () => new Set<string>()).add("Mr. Brightside");
声明全局{
接口图{
getOrSet(key:K,create:()=>V):V;
}
}
Map.prototype.getOrSet=函数(键:any,创建:()=>any){
设v=this.get(key);
如果(v==未定义){
set(key,(v=create());
}
返回v;
};
const songs=新地图();
songs.getOrSet(“杀手”,()=>newset()).add(“Brightside先生”);
然而,我不喜欢这种方法,因为它具有很强的侵入性和全球性的副作用

另一种方法是将行为混合到单个实例中:

interface MapWithGetOrSet<K, V> extends Map<K, V> {
  getOrSet(key: K, create: () => V): V;
}

function withGetOrSet<K, V>(map: Map<K, V>): MapWithGetOrSet<K, V> {
  (map as MapWithGetOrSet<K, V>).getOrSet = function (key: K, create: () => V) {
    let v = this.get(key);
    if (v === undefined) {
      this.set(key, (v = create()));
    }
    return v;
  };
  return map as MapWithGetOrSet<K, V>;
}
接口映射WithGetOrSet扩展映射{
getOrSet(key:K,create:()=>V):V;
}
函数withGetOrSet(映射:map):MapWithGetOrSet{
(映射为MapWithGetOrSet)。getOrSet=函数(键:K,创建:()=>V){
设v=this.get(key);
如果(v==未定义){
set(key,(v=create());
}
返回v;
};
以MapWithGetOrSet的形式返回地图;
}
没什么好的

现在是2020年,甚至Dart现在也有静态扩展方法。所以,我的问题是:

有没有办法在TypeScript 4.x中创建实/作用域静态扩展方法?