function requireNoNilElements<T>(values: T[], message?: string): NonNullable<T>[];
function requireNoNilElements<T>(values: readonly T[], message?: string): readonly NonNullable<T>[];
function requireNoNilElements<T>(values: Set<T>, message?: string): Set<NonNullable<T>>;
function requireNoNilElements<K, V>(values: Map<K, V>, message?: string): Map<K, NonNullable<V>>;
function requireNoNilElements<T extends null | undefined>(values: T, message?: string): T;
function requireNoNilElements(values: unknown, message?: string): unknown;
Коллекция с дыркой проходит любую другую проверку: она не null, не пуста и является корректным массивом. Пропуск всплывает гораздо позже — пустой ячейкой или Cannot read properties of undefined. Эта функция ловит его на границе и возвращает коллекцию с типом без null и undefined.
Принимается массив, Set или Map — у Map проверяются значения, а не ключи. Коллекция null или undefined проходит насквозь: этот случай относится к requireNonNull, и две проверки подряд не должны сообщать о нём дважды. Пустая коллекция проходит. Проверяется только верхний уровень, вложенный массив непрозрачен. Дырки в массиве считаются undefined, поэтому [1, , 3] отвергается.
Параметры
Параметр
Тип
Описание
values
unknown
Проверяемая коллекция.
message(необязательный)
string
Сообщение исключения. Если не задано, используется сообщение по умолчанию.
Возвращает
unknown — тот же объект коллекции с типом элементов без null и undefined.
Исключения
Исключение
Условие
IllegalArgumentException
элемент равен null или undefined.
IllegalArgumentException
values не является массивом, Set или Map.
Примеры
Проверка строки перед записью
/**
* Appends a contact row, refusing a row with a gap in it rather than writing a
* blank cell that shows up as a bug days later.
*/
export function appendContact(
sheet: GoogleAppsScript.Spreadsheet.Sheet,
name: string | null,
email: string | null
): void {
const row = requireNoNilElements([name, email], "name and email are both required");
sheet.getRange(sheet.getLastRow() + 1, 1, 1, row.length).setValues([row]);
}
function appendContact(sheet, name, email) {
const row = requireNoNilElements([name, email], "name and email are both required");
sheet.getRange(sheet.getLastRow() + 1, 1, 1, row.length).setValues([row]);
}
Сужение типа элементов
import { requireNoNilElements } from "apps-script-utils";
const values: Array<string | null> = readColumn();
const names: string[] = requireNoNilElements(values, "the column has empty cells");
Что проходит, а что нет
requireNoNilElements([1, 2, 3]); // => [1, 2, 3] — the same array
requireNoNilElements(new Map([["a", 1]])); // => the same Map
requireNoNilElements([]); // => []
requireNoNilElements(null); // => null — not this guard's concern
requireNoNilElements([1, undefined, 3]); // throws IllegalArgumentException
requireNoNilElements([1, , 3]); // throws — a hole is undefined