javascript - Kako proširiti dvije klase u Typescriptu
Trebam proširiti dvije klase iz istog imenskog prostora.
na primjer:
declare namespace myNameSpace{
class class1{
///some methods will be here
}
class class3 extends class1{
//some method wil be here
}
class class2 extends myNameSpace. class3 {
//some methods will be here
}
export namespace class2 {
//declaration will be here
}
}
trebam proširiti klasu 'myNameSpace.class1' kao i nazivni prostor 'class2'.
class newClass extends myNameSpace.class1, myNameSpace.class2 {
constructor() {
super();
}
}
Ako pozovem obje klase, dobijem poruku o pogrešci
klase mogu proširiti samo jednu klasu
Postoji li neki drugi način da se ovaj problem riješi u TypeScriptu.
Odgovor #1
Postoji li neki drugi način da se ovaj problem riješi u TypeScriptu.
TypeScript je po dizajnu jedinstveno nasljeđivanje.
Odgovor #2
Možete koristiti mixine, ali ne možete nadjačati metode (osim ako ne napišete vlastitu metodu applyMixins)
Korištenjem metode:
function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
derivedCtor.prototype[name] = baseCtor.prototype[name];
});
});
}
Morate implementirati (na praznom putu)
class NewClass implements myNameSpace.class1, myNameSpace.class2 {
// empty implementation
public methodFrom1 : ()=>void;
public methodFrom2 : ()=>number;
constructor() {
// no super()
}
}
sada koristi miješanje kako bi zapravo napravio više proširenih klasa:
applyMixins(NewClass, [myNameSpace.class1, myNameSpace.class2]);
i sada možete stvoriti klasu
const foo = new NewClass()
foo.methodFrom1() // actually calls nameSpace.class1.prototype.methodFrom1
