Как я могу проверить, содержит ли массив нулевые значения внутри typescript?

#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;