如何创建返回子类实例的泛型函数接口?

时间:2019-10-05 19:05:26

标签: typescript function generics interface

我想创建一个具有方法属性的接口。然后我想用打字稿要求这些方法是返回基类的任何子类的函数。

这是我认为可行的方法:

export interface ChildPagesNavigators {
  [name: string]: <T extends Page>() => Promise<T>
}

然后在抽象类中使用它:

export abstract class Page {
  constructor(protected driver: ThenableWebDriver) {}
  abstract navigate(): Promise<void>;
  abstract open: ChildPagesNavigators;
}

我尝试制作Page的子类,然后实现缺少的open属性。

export class Landing extends Page {
  async navigate(): Promise<void> {
    return this.driver.get(BASE_URL);
  }

  open = {
    async login(): Promise<Login> {
      await this.driver.findElement(By.linkText("login")).click();
      return new Login(this.driver);
    }
  };
}

我还定义了Login类来扩展Page

在这里我得到一个错误:

Error:(11, 3) TS2416: Property 'open' in type 'Landing' is not assignable to the same property in base type 'Page'.
  Type '{ login(): Promise<Login>; }' is not assignable to type 'ChildPagesNavigators'.
    Property 'login' is incompatible with index signature.
      Type '() => Promise<Login>' is not assignable to type '<T extends Page>() => Promise<T>'.
        Type 'Promise<Login>' is not assignable to type 'Promise<T>'.
          Type 'Login' is not assignable to type 'T'.

实际上Login扩展了Page,因此应符合T的要求。

我想定义ChildPagesNavigators接口,以便它可以包含返回扩展Page的类的实例的任何函数。怎么做?

0 个答案:

没有答案