TypeScript中的静态扩展方法
我们都知道用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) {
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中创建实/作用域静态扩展方法?