我正在使用Array.filter
和instanceof
从更通用的数组中获取某种类型的所有对象。
let cars:Car[] = this.gameObjects.filter(go => go instanceof Car)
这行得通!,但是打字稿编译器不同意返回的类型都是Car类型。
类型'GameObject []'不能分配给类型'Car []'
在Typescript GitHub上,可以通过为array.filter添加接口来解决此问题。这对我不起作用,它仍然会给出相同的错误。您可以通过将此代码粘贴到typescript playground:
中进行尝试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)
我在这里错过了什么吗?如何按类型过滤数组并返回正确类型的数组?
答案 0 :(得分:1)
要更改过滤器函数的返回类型,必须使用如下的类型保护函数。您也不需要扩展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)