#typescript
#typescript
Вопрос:
У меня есть массив, который может включать null
undefined
значения or
const uncertainObjectIds = ['5fc657037ed3e03d506e1e25', null, '5fc657037ed3e03d506e1e26', undefined]
Если uncertainObjectIds
он содержит какие-либо нулевые или неопределенные значения, я выдам сообщение об ошибке. Однако, если это не так, и я уверен, что массив полон определенных значений и не содержит неопределенных значений, я хочу его использовать.
const doNullValuesExistInsideObjectIds = uncertainObjectIds.some(
(objectIdOrNull) => !objectIdOrNull,
);
if (doNullValuesExistInsideObjectIds) {
throw new UserInputError(
'All Users must have ObjectIds',
);
}
const usersCollection = await getCollection('users');
const originalUsers = await usersCollection.find({
_id: { $in: uncertainObjectIds },
});
но TypesSript выдает мне ошибку.
Type '(ObjectId | null | undefined)[]' is not assignable to type 'ObjectId[]'
Каков наилучший способ обработки этого варианта использования внутри TypeScript?
Комментарии:
1. Является ли ваш массив массивом строк? Почему нет кавычек?
2. Это массив идентификаторов объектов MongoDB, но я добавлю кавычки.
3.
uncertainObjectIds.filter(f => !!f)
Ответ №1:
Для этого можно использовать защиту типа:
function nonNull<T>(arr: (T | null | undefined)[]): arr is T[] {
return arr.every(v => v !== null amp;amp; v !== undefined);
}
const mixed = [1, 2, 3, null, 4, 5, undefined, 6];
// uncommenting this line will error due to having null values
// const x: number[] = mixed;
// apply the type guard
if (!nonNull(mixed)) {
throw new Error("Cannot have null values.");
}
// no longer has null values
const y: number[] = mixed;