Angular 类型脚本重载最佳实践

Angular 类型脚本重载最佳实践,angular,typescript,overloading,Angular,Typescript,Overloading,尝试了解在TypeScript类中重载方法的最佳方法,并在编译时出现错误 有一个抽象类: export abstract class Collection { protected _collection: any; public hydrate(key: number, item: Object): Collection; public hydrate(key: any, item: any): Collection { this._collection.set(key,

尝试了解在TypeScript类中重载方法的最佳方法,并在编译时出现错误

有一个抽象类:

export abstract class Collection {
  protected _collection: any;

  public hydrate(key: number, item: Object): Collection;
  public hydrate(key: any, item: any): Collection {
    this._collection.set(key, item);
    return this;
  }

  public size(): number {
    return this._collection.size;
  }
}
混凝土等级:

export class Tours extends Collection {

  public constructor() {
    super();

    this._collection = new Map();
  }

  public hydrate(key: number, item: Tour) {
    this._collection.set(key, item);  
  }
}
编译失败,具体类(number和Tour)的类型出现错误,无法分配给父方法的number和Object

由于巡更类型是自定义类型,不知道如何正确实现此类方案


如何做到这一点?

您还需要保留原始签名:

public hydrate(key: number, item: Object) : Collection
public hydrate(key: number, item: Tour) : Collection
public hydrate(key: number, item: Tour) {
    return this._collection.set(key, item);
}
但在您的情况下,我建议将
集合
设置为通用:

export abstract class Collection<T> {
    protected _collection: Map<number, T>;

    public hydrate(key: number, item: T): this {
        this._collection.set(key, item);
        return this;
    }
    ...
}

export class Tours extends Collection<Tour> { }
导出抽象类集合{
受保护的收藏:地图;
公用水合物(图例:编号,项目:T):本{
此.u集合.set(键、项);
归还这个;
}
...
}
导出类旅行扩展集合{}

您还需要保留原始签名:

public hydrate(key: number, item: Object) : Collection
public hydrate(key: number, item: Tour) : Collection
public hydrate(key: number, item: Tour) {
    return this._collection.set(key, item);
}
但在您的情况下,我建议将
集合
设置为通用:

export abstract class Collection<T> {
    protected _collection: Map<number, T>;

    public hydrate(key: number, item: T): this {
        this._collection.set(key, item);
        return this;
    }
    ...
}

export class Tours extends Collection<Tour> { }
导出抽象类集合{
受保护的收藏:地图;
公用水合物(图例:编号,项目:T):本{
此.u集合.set(键、项);
归还这个;
}
...
}
导出类旅行扩展集合{}

为什么不使用OR运算符:
公共水合物(键:number | any,项:any | Tour}
。下面的问题解决了这个问题:可能想为这类事情使用泛型为什么不使用OR运算符:
公共水合物(key:number | any,item:any | Tour}
。这里有一个问题可以解决这个问题:可能想对这类东西使用泛型
\u collection
应该键入
Map
also@Gerrit0是的,你是对的,那会更好,编辑答案听起来很棒…但是新的TypeScript,什么是类型?@Jean LucAubert它是一个类型参数。它允许类保留未指定的类型,并允许类的用户指定任何类,而不是
T
。您可以在此处阅读更多信息:
\u collection
应键入为
Map
also@Gerrit0是的,你是对的,那会更好,编辑答案听起来很棒…但是新的打字稿t、 类型是什么?@Jean LucAubert它是一个类型参数。它允许类保留未指定的类型,并允许类的用户指定任何类,而不是
t
。您可以在此处阅读更多内容: