代码之家  ›  专栏  ›  技术社区  ›  mpen

如何定义{key:classType}映射?

  •  0
  • mpen  · 技术社区  · 6 年前

    以下是我得到的:

    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})
    }
    
    0 回复  |  直到 6 年前
    推荐文章