簡體   English   中英

TypeScript動態類-合並/刪除

[英]TypeScript dynamic class - combine/remove

我正在嘗試創建一個動態類,該動態類使用許多其他可能的類的組件構建。

我正在嘗試使用ES6 Object.assign()添加和刪除它們,並且可以獲取要復制的變量,但似乎無法獲取要復制的方法。

這是我要執行的操作的一個示例:

class foo {
  salad: string = 'salad';
  chop(){
    console.log('Chop');
  }
}

class man {
  nuts: string = 'nuts';
  kick(){
    console.log('Kick')
  }
}

class choo {
  add(){
    var f: foo = new foo();
    var m: man = new man();
    //Copy variables
    Object.assign(this, f, m);
    //Copy methods
    //Object.assign(this.prototype, f, m);
  }
  remove(){
    d = Object.getPrototypeOf(foo);
    for (key in d){
        delete this[key]
    }
  }
}

var karate = new choo();
karate.add();

//karate.chop();
console.log(karate.salad);
//karate.kick();
console.log(karate.nuts);

我試圖在http://fiddlesalad.com/typescript/上分享一個示例,但是這樣無法保存。 不起作用的代碼被注釋掉。

ES6建議使用Object.assign(this.prototype,obj1)將原型函數從一個類復制到另一個類,但TypeScript似乎不喜歡它。

有任何想法嗎?

這是一個完全hack,但它似乎可以滿足您的需求:

function extend < A, B > (d: A,
b: B) {
    for (var x in b) d[x] = b[x];
    return <A & B > d;
}

interface Object {
    assign < P, Q > (a: P,
    ...b: Q[]): P & Q;
}

interface ifoo {
    salad: string;
    chop();
}

interface iman {
    nuts: string;
    kick();
}

class foo implements ifoo {
    salad: string = 'salad';
    chop() {
        console.log('Chop');
    }
}

class man implements iman {
    nuts: string = 'nuts';
    kick() {
        console.log('Kick')
    }
}

class choo {
    foo: foo;
    man: man;
    add() {
        return extend(this, extend(this.foo = new foo(), this.man = new man()));        
    }
    remove() {
        Object.keys(this.man).forEach(k => delete this[k]);
        return <ifoo><any>this;
    }
}


let both = new choo();
var karate = both.add();
console.log("karate", karate);
karate.chop();
console.log(karate.salad);
karate.kick();
console.log(karate.nuts);

let chooman = both.remove();
console.log("karate", karate);
chooman.chop();

首先,我要指出,mixin可能是我正在尋找的正確答案。

這是一篇關於mixin的好文章:

https://www.stevefenton.co.uk/2014/02/TypeScript-Mixins-Part-One/

話雖如此,我確實找到了一個使用Object.assign()的解決方案,盡管由於直接更改__proto__可能使它有些皺眉。

Choo現在將如下所示:

class choo {
  add(){
    var f: foo = new foo();
    var m: man = new man();
    //Copy variables
    Object.assign(this, f, m);
    //Copy methods
    Object.assign(this.__proto__, foo.prototype, man.prototype);
  }
}

remove()方法已刪除,因為如果Object.assign()共享相同的名稱,它們將覆蓋類方法。 在測試之前,我不確定是否會有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM