【问题标题】:problems with multiple levels of inheritance in typescript打字稿中多级继承的问题
【发布时间】:2019-02-26 16:05:02
【问题描述】:

我正在使用 typescript 类库进行 api 访问,它是由定义类 ("UserApi") 的工具集自动生成的,该类具有扩展“基”类 ( "BaseApi") 具有通用方法。还有一个模型界面“User”;

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

我现在需要创建一个扩展“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&lt;User&gt;() 但得到了同样的错误

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

第二个问题是关于类扩展的级别。我突然想到,如果我可以修改库使用的模板,我实际上可以将 所有 代码生成为单个特定于模型的类,而不是 3。

我看到了几个优点

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

这有什么缺点?

  • 增加包大小(基类为 29k (!)) - 所以每个模型文件都会增加这个数量

【问题讨论】:

  • 这一行不好:public find(): Observable { return super.find(filter, customHeaders); } 你从哪里得到“filter”和“customHeaders”?它应该看起来更像这样: public find(filter: string, customHeaders: Object): Observable { return super.find(filter, customHeaders); }
  • 对不起,这是一个错字,我试图简化并忘记从帖子中删除这些内容。如果function和super都没有参数,报错还是一样

标签: typescript


【解决方案1】:

一种简单的解决方法可能是删除UserStoreService 中的find 覆盖。但真正的问题是findBaseApi 中的声明可能不是您想要的。这意味着每个BaseApi 实例(包括子类实例)都必须支持find 对于每个类型T。您可能希望将T 设为BaseApi 的类型参数(即BaseApi&lt;T&gt;)并从find 方法中删除&lt;T&gt;,以便每个子类都可以指定它支持的单一类型T。例如,UserApi 将扩展 BaseApi&lt;User&gt;

【讨论】:

  • 这正是我的想法 - 对为什么在 baseApi 中定义方法感到非常困惑。我会联系原始开发人员并直接询问他。它可以解决几个问题;)谢谢!
猜你喜欢
  • 2017-04-10
  • 2017-12-04
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
相关资源
最近更新 更多