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

时间:2019-05-27 12:45:21

标签: arrays typescript generics interface

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

 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)

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

1 个答案:

答案 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)