Typescript类型检查与数组筛选不兼容

12

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

 let cars:Car[] = this.gameObjects.filter(go => go instanceof Car)
这个可以工作!但是typescript编译器并不认同返回类型都是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个回答

15

要更改过滤函数的返回类型,您必须使用类型保护函数,例如以下内容。您也不需要扩展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 数组中自动推断出来。 - Xerillio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接