我正在使用Typescript开发ECS游戏引擎。在这个项目中,我使用“签名”,它本质上是一组类。这些类的数量或类型不是预先知道的,但它们都是从同一类中继承的。
签名看起来像这样:
[SerializableClassA, SerializableClassB, SerializableClassC]
签名被传递到SignatureManager中,SignatureManager具有一个Iterator返回如下数组:
["entityIDFoo", classAInstance, classBInstance, classCInstance]
我试图弄清楚如何正确定义Signature类型,从而使我能够通过Signature Managers将它们正确地线程化并将类型信息映射到Iterator输出。
在许多方面将签名定义为SerializableClass[]
很有意义,但似乎没有提供映射特定类类型的方法。将它们定义为元组[A, B?, C?, etc..]
似乎很笨拙,难以使用,并且由于确切的长度未知,因此可能是错误的。
我目前正在使用一个数组来表示签名,但是我正在研究Set(Set<SerializableClass>
)的性能特征,因此可以灵活地使用它。
其他信息:
极其简化的Signature Manager版本如下所示:
class SignatureManager {
private entityData : TEntityData[];
constructor (thisSignature : TSignature) {
this.entityData = getAllEntityDataMatchingSignature(thisSignature);
}
*[Symbol.iterator]() {
for (let data of this.entityData) {
yield data;
}
}
}
使用时,它看起来像这样:
this.signatureManagerFoo = new SignatureManager([SerializableClassA, SerializableClassB, SerializableClassC]);
for (let [entityID, classAInstance, classBInstance, classCInstance] of this.signatureManagerFoo) {
// Do stuff in here
// This is where types need to be automatically threaded through
}
现在使用SerializableClass []作为实例并不能完成任务,因为我需要能够为SignatureManager设置泛型,以便循环内的变量自动键入为获得的签名中类的实例通过。
答案 0 :(得分:0)
如果我的理解正确,那么您的案件可以归结为:
class Sequence<T extends any[]> {
private sequence: T[];
constructor(...args: T) {
this.sequence = [args];
}
*[Symbol.iterator]() {
for (let item of this.sequence) {
yield item;
}
}
}
for (let [a, b, c] of new Sequence(42, "foo", true)) {
/* ... */
}