2017-09-02 92 views
1

我正在清理我的Angular 4应用程序的类型,并且我想定义负责API调用的Database类的接口。我可以为一个类的方法定义一个泛型typescript接口吗?

这些类将有方法接收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>' 

有什么建议?或者这是不可能的? 在此先感谢!

回答

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); 
    } 
} 
+0

哇,我从来没有见过类似的东西,但现在的构造不适合签名:('住宅“API”的类型'ApiService'不能分配给字符串索引类型'(args:ItemsCriteria)=> Observable '.'似乎我应该坚持一个没有类型约束的约定。 –

相关问题