以下是我得到的:
type StructureManagerMap<T extends StructureConstant=StructureConstant> = { [K in T]?: StructManager<ConcreteStructure<K>>}
哪里
StructManager
是:
export abstract class StructManager<T extends Structure> {
constructor(readonly roomInfo: RoomInfo, readonly struct: T) {}
abstract buildCache?(): ScreepsReturnCode
abstract gameLoop(): ScreepsReturnCode
abstract drawVisuals?(): ScreepsReturnCode
}
我正在努力:
const managerMap: StructureManagerMap = {
[STRUCTURE_SPAWN]: SpawnManager, // <-- error here
}
哪里
SpawnManager
是:
export default class SpawnManager extends StructManager<StructureSpawn>{
...
}
和
STRUCTURE_SPAWN
只是一些字符串常量。
我得到的错误是:
TS2739:类型“typeof SpawnManager”缺少类型“StructManager”中的以下属性:roomInfo、struct、gameLoop
你的意思是在这个表达中使用“new”吗?
我
认为
它期待着
产卵经理
成为一名
例子
属于
结构管理器
但我真正想要的是成为一个扩展
结构管理器
这样写:
{ [K in T]?: typeof StructManager<ConcreteStructure<K>>}
甚至都不是有效的语法。如何将该对象定义为常量到扩展类的映射
StructManager<ConcreteStructure<K>>
?
这里是一个(更新)
self-contained example on TSPlayground
现在它基本上可以工作了,但我不想重复这个构造函数
结构管理器
到
new(...)
子孙后代的完整代码:
type StructureConstant = "spawn" | "tower";
interface Structure<T extends StructureConstant = StructureConstant> {
hits: number;
}
interface StructureSpawn extends Structure<"spawn">{
energy: number;
}
interface StructureTower extends Structure<"tower">{
energyCapacity: number;
}
type ConcreteStructure<T extends StructureConstant> = T extends "spawn"
? StructureSpawn
: T extends "tower"
? StructureTower
: never;
export abstract class StructManager<T extends Structure> {
constructor(readonly struct: T) {}
abstract gameLoop(): number
}
type StructureManagerMap<T extends StructureConstant=StructureConstant> = { [K in T]?: {new(s:ConcreteStructure<K>): StructManager<ConcreteStructure<K>>}}
class SpawnManager extends StructManager<StructureSpawn>{
gameLoop() {
return 0
}
}
const managers: StructureManagerMap = {
["spawn"]: SpawnManager,
}
if(managers["spawn"]) {
const spawnManager = new managers["spawn"]({hits:6,energy:5})
}