#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. Хорошо, потому что я не мог найти простого решения для пустого массива