Как сделать type guard для массива?

Рейтинг: 0Ответов: 1Опубликовано: 10.04.2023

Есть массив, который может быть двух типов, например I1[] | I2[] (интерфейсы). Как правильно описать функцию isI1, если массив может быть пустым, а тип проверить нужно (также тип можно передать женериком, но я пока не смог разобраться, как это использовать для гуарда)

export function isI1<T>(
  paths: I1[] | I2[] | T[] //Может быть пустым
): paths is I1[] {
  return
}

Ответы

▲ 0

По пустому массиву нельзя понять какого он типа, но это и не нужно. С точки зрения структурной типизации [] является подмножеством любого массива, поэтому верным будет реализовать тайпгард так:

function isI1(value: I1[] | I2[]): value is I1[] {
    if (value.length == 0) return true

    // Далее проверка для первого элемента
}