【问题标题】: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)

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

【问题讨论】:

    标签: arrays typescript generics interface


    【解决方案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 数组自动推断出来的。
    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 2018-11-03
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2022-09-24
    • 2019-07-26
    • 2020-11-16
    相关资源
    最近更新 更多