TypeScript:参数收集和继承

TypeScript: Parametric collection and inheritance

我正在将代码库从 JS 迁移到 TypeScript。我在设计这样的情况时遇到了一些问题:

假设一个房间class:

class Room {
   protected playersById : PlayerDict<Player>;

   getIds() {
      _.map(this.playersById, (p : Player) => { return p.getId() })
   }

   getFirst() {
      return _.first(this.playersById);
   }
}

还有一个名为 RoomGame

的 Room 的子class
class RoomGame extends Room {
   protected playersById : PlayerDict<PlayerGame>;

   someMethod() {
      var player = this.getFirst();
      player.getB(); // Error because player if of type `Player` not `PlayerGame`
   }
}

如何解决 someMethod 上的这种情况,我想要的是 PlayerGame 类型的集合 playersById 的第一项。我尝试使用通用 类 但如果我这样做 Room<GenericType> 我不能在父 class 房间上编写 getIds 之类的函数(因为 p.getId() 未知编译器,因为缺少类型信息)。

此处包含所有 class 的最小示例 http://pastebin.com/fL4JcGLj

谢谢!

我可能无法完全理解您的意图,但以下通用基础 class 可以满足您的描述:

class Room<T> {
   protected playersById : PlayerDict<T>;

   getFirst() {
      return _.first(this.playersById);
   }
}

class PlayerRoom extends Room<Player> {
    getIds() {
      _.map(this.playersById, (p : Player) => { return p.getId() })
   }
}

class RoomGame extends Room<PlayerGame> {
   someMethod() {
      var player = this.getFirst();
      player.getB();
   }
}

这意味着您原来的 Room 在我的示例中实际上称为 PlayerRoom(尽管您可以随意命名)。

这允许您共享适当的方法,例如 getFirst,但在子 class 中有依赖于 PlayerDict 类型的方法。

更新

这里是将getIds()方法提升到基础class...

的修改版本
interface HasId {
    getId(): number;
}

class Room<T extends HasId> {
   protected playersById : PlayerDict<T>;

   getFirst() {
      return _.first(this.playersById);
   }

    getIds() {
      _.map(this.playersById, (p : T) => { return p.getId(); })
   }
}

class PlayerRoom extends Room<Player> {

}

class RoomGame extends Room<PlayerGame> {
   someMethod() {
      var player = this.getFirst();
      player.getB();
   }
}