繁体   English   中英

TypeScript:参数收集和继承

[英]TypeScript: Parametric collection and inheritance

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

假设一个房间类别:

class Room {
   protected playersById : PlayerDict<Player>;

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

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

还有Room的子类,称为RoomGame

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哪里是什么我要的是集合的第一项playersById类型的PlayerGame 我尝试使用泛型类,但是如果我执行Room<GenericType> ,则无法在父类Room上编写诸如getIds类的函数(因为编译器未知p.getId() ,因为缺少类型信息)。

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

谢谢!

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

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 (尽管您可以PlayerRoom命名)。

这使您可以共享适当的方法(例如getFirst但要使用依赖于子类中PlayerDict类型的方法。

更新

这是将getIds()方法提升为基类的修订版本。

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();
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM