将数组和数组转换为不同类型的数组

时间:2017-06-06 12:45:30

标签: typescript

我正在使用GameObjects构建游戏。在我的游戏中,我将GameObjects与CollidableObject分开。所有对象(GameObjects和CollidableGameObjects)都被推送到一个名为gameObjects的数组。

当谈到碰撞检测时,我希望过滤gameObjects数组,这样我就只能循环使用CollidableObject类型的对象。我为此创建了以下代码:

let temp : any = this.gameObjects.filter(g => g instanceof CollidableObject);

//optional
let collidables : Array<CollidableObject> = temp;

for (let obj1 of collidables) {
    for (let obj2 of collidables){
        if (obj1 != obj2) {
            if(obj1.hasCollision(obj2)) {        
                obj1.onCollision(obj2);
                this.gameOver();
            } 
        }
    }
}

问题1:为什么不能直接过滤到CollidableObject数组?

问题2:是否有更简单的方法来过滤特定类型的数组?

1 个答案:

答案 0 :(得分:2)

你可以这样做:

let temp = this.gameObjects.filter(g => g instanceof CollidableObject) as CollidableObject[];

或者在数组界面中添加签名:

interface Array<T> {
    filter<S>(callbackfn: (this: void, value: T, index: number, array: T[]) => boolean): S[];
}

然后:

let temp = this.gameObjects.filter<CollidableObject>(g => g instanceof CollidableObject);

如果您正在使用模块系统(即您正在导入/导出),那么您需要扩充全局模块:

declare global {
    interface Array<T> {
        filter<S>(callbackfn: (this: void, value: T, index: number, array: T[]) => boolean): S[];
    }
}