我可以为类的方法定义通用的typescript接口吗?

时间:2017-09-02 04:52:06

标签: typescript

我正在清理我的Angular 4应用程序的类型,我想定义一个负责API调用的Database类的接口。

这些类将有接收Criteria个对象的方法,并返回大不相同的ResultItems[]的Observable。所以我试图定义这个接口:

import { Observable } from 'rxjs/Observable';

export interface Database<C> {
  [methodName: string]: (args: C) => Observable<any>;
}

涵盖接收Criteria并返回any内容的方法。

然后我尝试进行这种实现:

@Injectable()
export class ItemsDatabase<ItemsCriteria> implements Database<ItemsCriteria> {
  constructor(private api: ApiService) {}

  fetch(args: ItemsCriteria): Observable<APIResponse[]> {
    return this.api.fetchItems(args);
  }

  summary(args: ItemsCriteria): Observable<SummaryResponse[]> {
    return this.api.itemsSummary(args);
  }
}

但是打字稿否认了这一点:

Class 'ItemsDatabase<ItemsCriteria>' incorrectly implements interface 'Database<ItemsCriteria>'.
  Index signature is missing in type 'ItemsDatabase<ItemsCriteria>'

有什么建议吗?或者这是不可能的? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

您必须将索引签名添加到类

@Injectable()
export class ItemsDatabase<ItemsCriteria> implements Database<ItemsCriteria> {
  constructor(private api: ApiService) {}
  [methodName: string]: (args: ItemsCriteria) => Observable<any>;
  fetch(args: ItemsCriteria): Observable<APIResponse[]> {
    return this.api.fetchItems(args);
  }

  summary(args: ItemsCriteria): Observable<SummaryResponse[]> {
    return this.api.itemsSummary(args);
  }
}