如何从泛型Typescript函数返回具体类型?

如何从泛型Typescript函数返回具体类型?,typescript,generics,typescript-generics,entity-component-system,Typescript,Generics,Typescript Generics,Entity Component System,我正在开发一个实体组件系统,希望能够从我的get函数返回具体类型。以下是我目前的工作方式,它可以工作,但没有任何类型信息: enum CT { Null, Input, Transform, Physics } // CT = Component Type class Component { type: CT; constructor(type: CT) { this.type = type; } } class PhysicsComponent extends Component

我正在开发一个实体组件系统,希望能够从我的
get
函数返回具体类型。以下是我目前的工作方式,它可以工作,但没有任何类型信息:

enum CT { Null, Input, Transform, Physics } // CT = Component Type

class Component {
  type: CT;

  constructor(type: CT) { this.type = type; }
}

class PhysicsComponent extends Component {
  velocity: Vec2;
  
  constructor() { 
    super(CT.Physics); 

    this.velocity = new Vec2(0, 0);
  }
}

class Entity {
   components: Map<CT, Component>;

   get = (componentType: CT): any => {
     return this.components.get(componentType);
   }
}

let physics = entity.get(CT.Physics); // no type-safety since return type is any
??但这当然不是编译


此外,我还关心性能。目前,
CT
enum仅仅是数字,所以一切都非常快(而且它必须是,因为查询是游戏中最常见的操作),我的直觉是所有这些
typeof
调用、施放和获取类型信息(AFAIK只是在整个类上调用
toString
)它们的运行速度非常慢,所以我甚至不确定这是否是一个好主意,尽管它符合人体工程学,但由于性能成本的原因。有任何建议吗?

请考虑修改此代码以构成一个当它落入独立IDE时,清楚地演示了您的问题,并且没有其他问题(未声明的变量或类型)。这将使人们更容易给你一个答案,他们可以在发布前测试,你可以在发布后测试。还要注意,TypeScript的静态类型系统是在TypeScript代码编译成JavaScript时进行的。因此,像
get():T{…}
这样的代码将编译为
get(){…}
,因此像
get()
这样的代码绝对不会返回与
get()
不同的内容。类似地,
typeof
type查询操作符将
转换为
,并获取类型信息,不会在运行时发生,也不会影响运行时性能。类似的操作是否适用于您?如果是这样,我可以写一个答案;如果没有,请详细说明,最好是生产一个我可以从工作。祝你好运@jcalz嘿,很抱歉没有创建一个最小可复制的示例,但您的示例看起来正是我要制作的,所以这很好。我真的不明白你的答案是怎么回事。我想我可能需要一个解释。你是说在实体的构造函数中,我需要给它游戏中的每个组件,但它们都是空的吗?因为我现在有100个组件,很快我可能会有200多个。所以每一个被创建的新实体都必须运行100-300行代码,将每个组件值设置为null?一个实体并不是每个组件都有,只有一些我很乐意解释,但我不知道我是否理解用例。如果一个实体只有一些组件,您希望
get()
如何工作?您的示例暗示它将始终返回一个值(除非您没有使用;如果您没有使用,则您真的应该这样做)。您是否希望它返回
未定义的
,并且您必须像这样检查它?如果你喜欢这个版本,我可以写一个,当然还有解释。
let physics = entity.get<PhysicsComponent>();
components: Map<typeof Component, Component>;

get<T extends Component>(): T {
  return this.components.get(typeof T) as T;
}