从子类泛型类型推断出Typescript mixin函数

时间:2018-09-26 22:01:31

标签: typescript generics mixins

以下是我目前遇到的问题的示例。我正在尝试编写一个mixin,以正确地推断和反映提供给mixin的类的子类中的泛型类型。

abstract class A<T = {}> {
  public abstract init(): T;
}

interface IB {
  something: string;
}

class B extends A<IB> {
  public init(): IB {
    return null;
  }
}

type ConstructorOf<T = {}> = new (...args: any[]) => T;

function ApplyC<T extends ConstructorOf<A>>(base: T) {
  abstract class C extends base {

  }
  return C;
}

class D extends ApplyC(B) {
  constructor() {
    super();
    // this.init()
  }
}

在我写this.init()的地方,智能感知告诉我init()过载,一个是init(): {},另一个是init(): IB,这是问题所在是我不希望出现过载,我只是希望IB出现。

我需要在混合中以某种方式推断T中的A<T = {}>,并将其从提供的ConstructorOf<A>传递给base: T

1 个答案:

答案 0 :(得分:0)

您真的需要限制ApplyC函数以仅接收A的子类吗? 如果否,则可以将A替换为any,例如:

    function ApplyC<T extends ConstructorOf<any>>(base: T) {

然后D.init()将仅返回IB,而不会返回其他任何内容。