打字稿:通用类型检查和儿童可用性

时间:2020-10-25 21:48:57

标签: angular typescript generics

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

我有从“ BaseModel”类扩展的类(User,Address等)。 我有一个使用通用类型T扩展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);
       // }
     })
   );
 }
}

但是这两种方法不起作用。

如何成功完成此操作?

谢谢。

1 个答案:

答案 0 :(得分: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);
     })
   );
 }
}