首页 > 解决方案 > Typescript父类方法返回类型由子属性更改

问题描述

有没有办法让类的父类使用的方法返回准确的类型(当它用于派生类型的属性发生更改时)?

例子:

abstract class A {
  a: string

  constructor(a: string) {
    this.a = a;
  }
}


class B extends A {
  b: string

  constructor(a: string, b: string) {
    super(a);
    this.b = b;
  }
}


abstract class AColl {
  abstract itemsMap: Map<string, A>

  items() {
    return [...this.itemsMap.values()];
  }
}

class BColl extends AColl {
  itemsMap: Map<string, B>
}

const bColl = new BColl();

bColl.items() -> Map<string, A> instead of Map<string,B>

在此示例中,Intellisense 认为这是 Map<string, A> 而不是 Map<string,B>,尽管我认为它能够派生正确的类型(也许我的想法很幼稚),但我可以得到它。

有没有办法实现这一点而不必在子类上重新实现该方法?

标签: typescriptinheritance

解决方案


为什么不只是参数化基类:

abstract class AColl<V extends A = A> {
    itemsMap: Map<string, V>; // no need to be abstract when class'es type param is used.

    items(): V[] {
        return [...this.itemsMap.values()];
    }
}

class BColl extends AColl<B> {
    // no need to have itemsMap field - extends AColl<B> does the job.
}

const bColl = new BColl();
bColl.items()

推荐阅读