2016-04-01 15 views
0

私は、他の多くの可能なクラスのコンポーネントを使用して構築された動的クラスを作成しようとしています。TypeScript動的クラス - 結合/削除

私は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/上で共有するために例を取得しようとしましたが、それは保存しないでしょう。機能していないコードはコメントアウトされています。

Object.assign(this.prototype、obj1)は、あるクラスから別のクラスにプロトタイプ関数をコピーするためにES6が推奨するものですが、TypeScriptはそれを好まないようです。

アイデア?

+0

これはマルチ継承を試みているようです。私はまずそれを調べます。注:Typescriptはそれを理解できないので、私は動的な多重継承を提案しません。また、実際に生成されたjsを見て、 'Object.assign'がなぜ機能していないのかを確認することをお勧めします。 – RainingChain

答えて

0

まず私は、ミックスインは、おそらく私が何を探していたものに正解であることを指摘します。ここで

がミックスインについての良い記事です:

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

言われていること、私はそれはおそらく、直接__proto__を変異に起因するひんしゅくを買うビットだが、Object.assign()を使用するソリューションを把握しました。

チューは次のようになります:彼らは同じ名前を共有する場合Object.assign()はクラスメソッドを上書きするため

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()方法が削除されました。テストの前に、問題があるかどうかはわかりませんでした。

0

これは総ハックですが、あなたが探しているものをやっているようだ:オフ

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(); 
関連する問題