我想创建一个具有方法属性的接口。然后我想用打字稿要求这些方法是返回基类的任何子类的函数。
这是我认为可行的方法:
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
的类的实例的任何函数。怎么做?