打字稿类型检查不适用于数组过滤器
Posted
技术标签:
【中文标题】打字稿类型检查不适用于数组过滤器【英文标题】:Typescript type check not working with Array filter 【发布时间】:2019-10-13 01:10:27 【问题描述】:我正在使用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)
我在这里遗漏了什么吗?如何按类型过滤数组并取回正确类型的数组?
【问题讨论】:
【参考方案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)
【讨论】:
注意,也可以内联定义类型保护:gameObjects.filter((obj: any): obj is Car => obj instanceof Car)
。您甚至可以省略 : any
,因为它是从 gameObjects
数组自动推断出来的。以上是关于打字稿类型检查不适用于数组过滤器的主要内容,如果未能解决你的问题,请参考以下文章