如何在Typescript中保存具有可变长度元组的类型信息?

时间:2019-02-16 22:41:53

标签: typescript

我正在使用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设置泛型,以便循环内的变量自动键入为获得的签名中类的实例通过。

1 个答案:

答案 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)) {
    /* ... */
}

请参见TypeScript Playground