Как проверить что массив из Foo или Bar?

Для проверки типа массива, состоящего из элементов типа Foo или Bar, в TypeScript, мы можем использовать условные типы и инструкцию typeof.

Допустим, у нас есть интерфейсы Foo и Bar:

interface Foo {
  // свойства и методы интерфейса Foo
}

interface Bar {
  // свойства и методы интерфейса Bar
}

Затем, предположим, у нас есть переменная arr, которая может быть массивом элементов типа Foo или Bar. Чтобы проверить, что arr имеет тип массива Foo или Bar, мы можем определить дополнительный тип ArrayOfFooOrBar используя условные типы:

// определяем тип ArrayOfFooOrBar
type ArrayOfFooOrBar<T> = T extends (Foo | Bar)[] ? T : never;

// проверяем тип массива arr
const fooOrBarArray: ArrayOfFooOrBar<typeof arr> = arr;

Тип ArrayOfFooOrBar использует условный тип T extends (Foo | Bar)[] ? T : never, чтобы проверить, является ли тип T массивом элементов типа Foo или Bar. Если это так, тип ArrayOfFooOrBar принимает значение T, иначе - never.

Затем мы объявляем переменную fooOrBarArray, тип которой - ArrayOfFooOrBar<typeof arr>. Мы можем присвоить arr этой переменной, что означает, что arr успешно прошел проверку на соответствие типу массива из Foo или Bar.

Вот полный пример:

interface Foo {
  // свойства и методы интерфейса Foo
}

interface Bar {
  // свойства и методы интерфейса Bar
}

const arr: (Foo | Bar)[] = [/* элементы массива */];

// определяем тип ArrayOfFooOrBar
type ArrayOfFooOrBar<T> = T extends (Foo | Bar)[] ? T : never;

// проверяем тип массива arr
const fooOrBarArray: ArrayOfFooOrBar<typeof arr> = arr;

Этот код гарантирует, что arr является массивом элементов типа Foo или Bar. Если arr имеет другой тип или несоответствующую структуру, компилятор TypeScript выдаст ошибку.

Таким образом, мы можем использовать условные типы и инструкцию typeof для проверки типа массива, состоящего из элементов типа Foo или Bar в TypeScript.