打字稿中多个继承级别的问题

时间:2018-09-22 14:02:18

标签: typescript

我正在使用一个用于API访问的类的类型库,该类库是由工具集自动生成的,该工具集定义了一个类(“ UserApi ”),该类具有扩展“基本”类( “ BaseApi ”)具有通用方法。还有一个模型界面“ 用户”;

这些类使用泛型来确保/保持类型安全。

我现在需要创建本身扩展了“ UserApi ”的第三类(属于我自己的类,不是库的一部分)。

我遇到的第一个问题是我想覆盖`find'方法(在“ BaseApi ”中定义)

所以,在我的课程“ MyClass ”中,我有

import {User} from 'sdk';

export class UserStoreService extends UserApi {
    constructor(
    ) {
        super();
    }

    public find(): Observable<User[]> {
        return super.find();
    }
}

BaseApi ”类中find方法的定义是

public find<T>(): Observable<T[]> {
        return this.request(

我收到语法错误

Property 'find' in type 'UserStoreService' is not assignable to the same property in base type 'UserApi'.   Type '() => Observable<User[]>' is not assignable to type '<T>() => Observable<T[]>'.
    Type 'Observable<User[]>' is not assignable to type 'Observable<T[]>'.
      Type 'User[]' is not assignable to type 'T[]'.
        Type 'User' is not assignable to type 'T'.

所以我想我将super.find()更改为super.find<User>(),但遇到了相同的错误

如何使这些函数调用匹配?

第二个问题是关于这里进行的课堂扩展的水平。这种想法让我震惊,如果我可以修改库使用的模板,实际上我可以只将代码的 all 全部生成到一个特定于模型的类中,而不是3。

我看到了几个优点

  • 需要处理的文件更少
  • 较少要处理的泛型
  • 更容易阅读和维护的代码

这有什么缺点?

  • 增加程序包大小(基类为29k(!))-因此每个模型文件将增加此数量

1 个答案:

答案 0 :(得分:1)

一种简单的解决方法可能是仅删除findUserStoreService的替代。但是真正的问题是findBaseApi的声明可能不是您想要的。这意味着每个BaseApi实例(包括子类实例)必须为每种类型find支持T。您可能希望将T作为类型BaseApi(即BaseApi<T>)的参数,并从<T>方法中删除find,以便每个子类可以指定它支持的单一类型T。例如,UserApi将扩展BaseApi<User>