Защита от null[]

#arrays #typescript #typeguards

Вопрос:

Я работаю с некоторыми автоматически сгенерированными типами из GraphQL-data и нуждаюсь в способе создания typeguard для null, undefined и null[] для сужения типов.

До сих пор я получил это:

 export default function validData<T>(
  condition: T
): asserts condition is Exclude<T, null | undefined | null[]> {
  if (
    condition === null ||
    condition === undefined ||
    (Array.isArray(condition) amp;amp; typeof condition[0] === null)
  ) {
    throw new Error(
      `missing data: ${condition} returned null, null[] or undefined`
    );
  }
}
 

А затем я просто использую функцию следующим образом:

 validData(menuDataToNarrow):
 

Функция работает против null и undefined, но я не могу понять, как перехватывать и выдавать ошибки, если данные содержат пустой массив? Приведенный выше код был моей лучшей (нерабочей) попыткой на данный момент.
Типы сужаются, как и ожидалось, когда дело доходит до null и undefined, но я все равно получаю:

 XXX is not assignable to type null[]
 

Есть идеи, как это исправить?

Редактировать: я придумал эту готовую защиту, которая работает:

 export default function validData<T>(
  condition: T
): asserts condition is Exclude<T, null | undefined | null[]> {
  if (
    condition === null ||
    condition === undefined ||
    (Array.isArray(condition) amp;amp; condition.every((x) => x === null))
  ) {
    throw new Error(
      `missing data: ${condition} returned null, null[] or undefined`
    );
  }
}
 

Комментарии:

1. Проверка пустого массива — это просто Array.isArray(data) amp;amp; data.length === 0 — это то, что вам нужно?

Ответ №1:

null[] Это был бы массив с нулевыми значениями. Вы можете проверить это с помощью Array.prototype.every()
Я думаю, вы ищете «пустой массив», который представляет [] собой массив длиной 0 или Array.isArray(data) amp;amp; data.length === 0 , как предложил @VLAZ в комментариях

Редактировать на основе вашего комментария:
Будьте осторожны, чтобы правильно проверять наличие null и / или undefined в вашем коде. Я пытался определить пустой массив, но это не кажется тривиальным в TS

введите описание изображения здесь

Комментарии:

1. Большое спасибо! Именно то, что мне было нужно, и извините за мою плохую формулировку: конечно, я имел в виду массив нулей (null[]). Я принял ваш ответ, поскольку он решил мой вопрос 🙂

2. Хорошо, потому что я не мог найти простого решения для пустого массива