Как расширить два класса в Typescript

Мне нужно расширить два класса из одного и того же пространства имен.

например:

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

мне нужно расширить класс myNameSpace.class1, а также пространство имен class2.

class newClass extends myNameSpace.class1, myNameSpace.class2 {

   constructor() {
    super();
   }
}

Если я вызову оба класса, я получу сообщение об ошибке

классы могут расширять только один класс

Есть ли другой способ исправить эту проблему в typescript.


person Kalai    schedule 02.01.2018    source источник
comment
Вы можете создавать интерфейсы и реализовывать их в своем классе.   -  person Rajesh    schedule 02.01.2018
comment
Возможный дубликат Typescript: как расширить два класса?   -  person Rajesh    schedule 02.01.2018
comment
Сначала погуглите проблему. Дюп имеет очень похожее название и является первой ссылкой на странице.   -  person Rajesh    schedule 02.01.2018


Ответы (2)


Есть ли другой способ исправить эту проблему в typescript.

TypeScript — это одиночное наследование по замыслу.

person basarat    schedule 02.01.2018

Вы можете использовать примеси, но вы не можете переопределять методы (если только вы не напишете пользовательские applyMixins методы)

Используя метод:

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

Вы должны реализовать (на пустом пути)

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

теперь используйте микширование, чтобы фактически сделать его несколькими классами расширения:

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

и теперь вы можете создать класс

const foo = new NewClass()
foo.methodFrom1() // actually calls nameSpace.class1.prototype.methodFrom1
person Daniel Krom    schedule 02.01.2018