Typescript泛型约束扩展了其他泛型类型

时间:2017-02-15 16:06:09

标签: generics typescript type-safety

我想创建一个可重用的网络服务组件,该组件负责Item的CRUD请求。

让我们说CatService想要请求cats列表,然后它可以有restService个实例,它可以用它来列表,创建,更新,删除...

private restService:RestListService<Cat[]> = RestListService();
...
restService.list(urlToGetCats).then(cats => console.log(listdata));
...
restService.update(urlToUpdateACat, updatedCat);

我实现了这个通用组件,但它不够安全。类声明如下:

export class RestListService<T extends Array<Identifiable>> {

    private dataSubject$: BehaviorSubject<T> = null;

    list(url: string): Promise<T> { }

    // PROBLEM: I cannot specify the `savingInstance` & the returned Promise type: 
    update(updateURL: string, savingInstance: Identifiable): Promise<Identifiable> { }

}

理想情况下,我会做一些事情,比如引入一个通用V作为数组中项目的类型,以使数组(和整个类)更加类型安全:

export class RestListService<T extends Array<V extends Identifiable>> {

    //Here the Promise is type safe:
    update(updateURL: string, savingInstance: Identifiable): Promise<V> { }

}

但目前不允许(正如我所见)。

在这种情况下,我可以以某种方式解决类型安全问题吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你的意思是这样吗?

export class RestListService<V extends Identifiable, T extends Array<V>> {

    //Here the Promise is type safe:
    update(updateURL: string, savingInstance: Identifiable): Promise<V> { }

}