过滤数组并将数组转换为不同类型的数组

Bob*_*aar 6 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();
            } 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

问题 2:有没有更简单的方法来过滤某种类型的数组?

Nit*_*mer 9

你可以这样做:

let temp = this.gameObjects.filter(g => g instanceof CollidableObject) as CollidableObject[];
Run Code Online (Sandbox Code Playgroud)

或者给数组接口添加一个签名:

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

进而:

let temp = this.gameObjects.filter<CollidableObject>(g => g instanceof CollidableObject);
Run Code Online (Sandbox Code Playgroud)

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

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