2016-04-01 14 views
0

Diğer birçok olası sınıfın bileşenleri kullanılarak oluşturulmuş dinamik bir sınıf oluşturmaya çalışıyorum.TypeScript dynamic class - birleştirme/kaldırma

ES6 Object.assign() kullanarak bunları eklemeye ve kaldırmaya çalışıyorum ve kopyalanacak değişkenleri alabiliyorum ancak kopyalanacak yöntemleri göremiyorum. İşte

ben yapmaya çalışıyorum şeyin bir örnektir:

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); 

Ben http://fiddlesalad.com/typescript/ paylaşmak için bir örnek almaya çalıştı ama tasarruf olmaz. Çalışmayan kod yorumlanmıştır.

Object.assign (this.prototype, obj1), prototip işlevlerini bir sınıftan diğerine kopyalamak için ES6'nın önerdiği şeydir, ancak TypeScript bunu beğenmedi.

Herhangi bir fikrin var mı?

+0

Görünüşe göre, çoklu miras yapmaya çalışıyorsunuz. İlk önce ona bakardım. Not: Typescript'in anlayamayacağı gibi dinamik çok kalıtım önermem. Ayrıca, Object.assign'ın neden çalışmadığını görmek için oluşturulan asıl js'lere bakmanızı öneririm. – RainingChain

cevap

0

İlk kapalı Katmalar muhtemelen yapmaya aradığı şeyi doğru cevabı olduğunu değineceğiz.

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

söyleniyor, ben bunun nedeni hoş karşılanmaz biraz doğrudan __proto__ mutasyona için muhtemelen rağmen Object.assign() kullanan bir çözüm anlamaya vermedi:

İşte Mixins hakkında iyi makale.

Choo artık şu şekilde görünecektir: aynı adı paylaşan eğer Object.assign() sınıf yöntemleri üzerine yazılır çünkü

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() yöntem silindi. Testten önce, bununla ilgili sorun olup olmadığından emin değildim.

0

Bu tamamen kesmek ama aradığınız ne yapacağını görünüyor:

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();