[英]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.