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

Posted

技术标签:

【中文标题】打字稿类型检查不适用于数组过滤器【英文标题】:Typescript type check not working with Array filter 【发布时间】:2019-10-13 01:10:27 【问题描述】:

我正在使用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】:

要更改过滤器函数的返回类型,您必须使用如下所示的类型保护函数。你也不需要扩展 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 =&gt; obj instanceof Car)。您甚至可以省略 : any,因为它是从 gameObjects 数组自动推断出来的。

以上是关于打字稿类型检查不适用于数组过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中过滤对象数组

根据打字稿中另一个数组的值过滤数组

如何在打字稿中显示从数组中过滤的对象列表?

在打字稿映射类型中过滤 keyof 意外工作

过滤掉打字稿中接口的不需要的对象属性

Nodejs 加密模块不适用于打字稿