【问题标题】:Typescript : Generic type checking and child usabilityTypescript:通用类型检查和子可用性
【发布时间】:2021-02-08 05:47:16
【问题描述】:

在具有泛型类型的方法中,我想识别对象以便对其进行强制转换并调用子类的方法。

我有从“BaseModel”类扩展而来的类(用户、地址、...)。 我有一个使用泛型类型 T extends BaseModel 的存储库类。

在这些存储库中,我想从子类中调用“fromJson”函数。 通过 T.fromJson ,或尝试使用开关检查对象的类型,或任何其他可能性...

export class RepositoryService<T extends BaseModel> {
 constructor(protected api: ApiService) {}

 findById(id: number): Observable<T> {
   return this.api.findById(id).pipe(
     map((o) => {
       // return T.fromJson(o);
       // OR
       // switch(T) {
       //   case User:
       //     return User.fromJson(o);
       //   case Address:
       //     return Address.fromJson(o);
       // }
     })
   );
 }
}

但这两种方法都行不通。

我怎样才能成功地做到这一点?

谢谢。

【问题讨论】:

    标签: angular typescript generics


    【解决方案1】:

    T 这样的打字稿注解在运行时不存在,所以你不能使用T 来确定类型。但是,您可以使用构造函数来注入对此RepositoryService 所针对的类的引用。

    这些类型可能不太正确,但希望这能让您走上正确的道路:

    interface JsonConstructable<T> {
      fromJson(json: string): T;
    }
    
    export class RepositoryService<T extends BaseModel> {
    
     constructor(protected api: ApiService, private readonly modelClass: JsonConstructable<T>) {}
    
     findById(id: number): Observable<T> {
       return this.api.findById(id).pipe(
         map((o) => {
           this.modelClass.fromJson(o);
         })
       );
     }
    }
    

    【讨论】:

    • 感谢您的回答!事实上,这个存储库不是为了模型类,而是为了生成这个模型。所以我不能将它作为构造函数参数传递:/
    • 您将传递对类本身的引用,而不是类的实例。我以为你有一个User 类?还是我误读了这个? “我有从“BaseModel”类扩展而来的类(用户、地址、...)”
    • 是的,我有。我怎么能只传递对类的引用?例如,当我只传递“用户”时,这不起作用,在类 UserRepository 扩展 RepositoryService 中,我不能在构造函数 super(api, User); --> 我该怎么办?
    • 对,所以我说的是组合/依赖注入而不是继承。您将只有一个 RepositoryService 类,但每个模型都有一个 instance。每个实例的类型T 对应于模型。 const UserRepository = new RepositoryService(api, User) 应该创建一个 UserRepository 类型为 RepositoryService&lt;User&gt; 的对象。
    猜你喜欢
    • 2018-08-20
    • 2017-06-24
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2019-01-19
    • 2017-12-06
    相关资源
    最近更新 更多