如何从泛型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;
}