Проверка типа шрифта не работает с фильтром массива - PullRequest
0 голосов
/ 27 мая 2019

Я использую Array.filter и instanceof, чтобы получить все объекты определенного типа из более общего массива.

 let cars:Car[] = this.gameObjects.filter(go => go instanceof Car)

Это работает! Но машинописьКомпилятор не согласен с тем, что все возвращаемые типы относятся к типу Car.

Тип 'GameObject []' нельзя назначить типу 'Car []'

На Typescript GitHub эта проблема считается решенной путем добавления интерфейса для array.filter.Это не работает для меня, это все равно дает ту же ошибку.Вы можете попробовать это, вставив этот код в машинописную игровую площадку:

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 Ответ

1 голос
/ 27 мая 2019

Чтобы изменить тип возвращаемого значения в функции фильтра, необходимо использовать функцию защиты типа, как показано ниже.Вам также не нужно расширять тип 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...