TypeScript中的多类继承

时间:2015-12-29 14:59:15

标签: javascript class inheritance interface typescript

有什么方法可以解决只允许扩展至多一个其他类的问题。

class Bar {

  doBarThings() {
    //...
  }

}

class Bazz {

  doBazzThings() {
    //...
  }

}

class Foo extends Bar, Bazz {

  doBarThings() {
    super.doBarThings();
    //...
  }

}

目前无法做到这一点,TypeScript会出错。可以通过使用接口来克服其他语言中的这个问题,但是在TypeScript中无法解决这些问题。

欢迎提出建议!

3 个答案:

答案 0 :(得分:4)

这可以使用接口:

interface IBar {
  doBarThings();
}

interface IBazz {
  doBazzThings();
}

class Foo implements IBar, IBazz {
  doBarThings() {}
  doBazzThings(){}
}

但是如果你想以super / base的方式实现这一点,那么你必须做一些不同的事情,比如:

class FooBase implements IBar, IBazz{
  doBarThings() {}
  doBazzThings(){}
}

class Foo extends FooBase {
  doFooThings(){
      super.doBarThings();
      super.doBazzThings();
  }
}

答案 1 :(得分:0)

这是我扩展多个类的解决方法。它提供了一些不错的类型安全性。我还没有发现这种方法的主要缺点,就像我想要多重继承一样。

首先声明要在目标类上实现的接口

interface IBar {
  doBarThings(): void;
}

interface IBazz {
  doBazzThings(): void;
}

class Foo implements IBar, IBazz {}

现在,我们必须将实现添加到Foo类中。我们可以使用还实现以下接口的类mixin:

class Base {}

type Constructor<I = Base> = new (...args: any[]) => I;

function Bar<T extends Constructor>(constructor: T = Base as any) {
  return class extends constructor implements IBar {
    public doBarThings() {
      console.log("Do bar!");
    }
  };
}

function Bazz<T extends Constructor>(constructor: T = Base as any) {
  return class extends constructor implements IBazz {
    public doBazzThings() {
      console.log("Do bazz!");
    }
  };
}

使用类mixins扩展Foo类:

class Foo extends Bar(Bazz()) implements IBar, IBazz {
  public doBarThings() {
    super.doBarThings();
    console.log("Override mixin");
  }
}

const foo = new Foo();
foo.doBazzThings(); // Do bazz!
foo.doBarThings(); // Do bar! // Override mixin

答案 2 :(得分:0)

这并不是真正解决问题的方法,但是还是值得考虑使用组合而不是继承。

Prefer composition over inheritance?