2017-09-02 69 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 '.'似乎我應該堅持一個沒有類型約束的約定。 –

相關問題