javascript - Bagaimana cara memperluas dua kelas di Typescript


Saya perlu memperluas dua kelas dari namespace yang sama.

misalnya:

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
     }
}

saya perlu memperluas kelas 'myNameSpace.class1' serta namespace 'class2'.

class newClass extends myNameSpace.class1, myNameSpace.class2 {

   constructor() {
    super();
   }
}

Jika saya memanggil kedua kelas tersebut, saya mendapatkan pesan kesalahan

kelas hanya dapat memperluas satu kelas

Apakah ada cara lain untuk memperbaiki masalah ini di typescript.

Jawaban #1

Apakah ada cara lain untuk memperbaiki masalah ini di typescript.

TypeScript adalah pewarisan tunggal berdasarkan desain.

Jawaban #2

Anda bisa menggunakan mixin tetapi Anda tidak bisa menimpa metode (kecuali Anda menulis metode applyMixins khusus)

Menggunakan metode:

function applyMixins(derivedCtor: any, baseCtors: any[]) {
    baseCtors.forEach(baseCtor => {
        Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
            derivedCtor.prototype[name] = baseCtor.prototype[name];
        });
    });
}

Anda harus mengimplementasikan (dengan cara kosong)

class NewClass implements myNameSpace.class1, myNameSpace.class2 {
   // empty implementation
   public methodFrom1 : ()=>void;
   public methodFrom2 : ()=>number;
   constructor() {
      // no super()
   }
}

sekarang gunakan mixing untuk benar-benar membuatnya memperluas banyak kelas:

applyMixins(NewClass, [myNameSpace.class1, myNameSpace.class2]);

dan sekarang Anda bisa membuat kelas

const foo = new NewClass()
foo.methodFrom1() // actually calls nameSpace.class1.prototype.methodFrom1

Artikel terkait