打字稿类型检查不适用于数组过滤器

Kok*_*oko 3 arrays generics interface typescript

我正在使用Array.filterinstanceof从更通用的数组中获取某种类型的所有对象。

 let cars:Car[] = this.gameObjects.filter(go => go instanceof Car)
Run Code Online (Sandbox Code Playgroud)

这有效!但是打字稿编译器不同意返回的类型都是 Car 类型。

类型“GameObject[]”不可分配给类型“Car[]”

Typescript GitHub 上,这个问题被认为是通过为 array.filter 添加一个接口来解决的。这对我不起作用,它仍然给出相同的错误。您可以通过在打字稿游乐场中粘贴此代码来尝试一下

interface Array<T> {
    filter<U extends T>(pred: (a: T) => a is U): U[];
}

class Car { 
    drive() { 

    }
}
class GameObject { 

}

let gameObjects:GameObject[] = [new Car(), new Car()]

let cars:Car[] = gameObjects.filter((go) => go instanceof Car)
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?如何按类型过滤数组并取回正确类型的数组?

goe*_*ing 6

要更改过滤器函数的返回类型,您必须使用如下所示的类型保护函数。你也不需要扩展 Array 类型,因为它已经在 TypeScript 上定义了。

class GameObject { 

}

class Car { 
    drive() { 

    }
}

let isCar = (obj: any): obj is Car => {
    return obj instanceof Car;
}

let gameObjects: GameObject[] = [new Car(), new Car()]

let cars: Car[] = gameObjects.filter(isCar)
Run Code Online (Sandbox Code Playgroud)