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();
}
}
我正在将代码库从 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 的子classclass 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();
}
}