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;
Une collection trouée passe toutes les autres gardes : elle n'est ni nulle, ni vide, et reste un tableau valide. Le trou ressort bien plus tard sous forme de cellule blanche ou de Cannot read properties of undefined. Cette garde l'attrape à la frontière et rend la collection typée sans les valeurs nulles.
Elle accepte un tableau, un Set ou une Map — pour une Map, ce sont les valeurs qui sont vérifiées, pas les clés. Une collection null ou undefined passe telle quelle : ce cas relève de requireNonNull, et empiler les deux gardes ne doit pas le signaler deux fois. Une collection vide passe. Seul le premier niveau est examiné. Les trous d'un tableau comptent comme undefined, donc [1, , 3] est rejeté.
Paramètres
Paramètre
Type
Description
values
unknown
La collection à vérifier.
message(facultatif)
string
Le message de l'exception. À défaut, un message par défaut est utilisé.
Valeur de retour
unknown — la même collection, typée sans null ni undefined dans le type de ses éléments.
Exceptions
Exception
Condition
IllegalArgumentException
un élément vaut null ou undefined.
IllegalArgumentException
values n'est ni un tableau, ni un Set, ni une Map.
Exemples
Vérifier une ligne avant de l'écrire
/**
* 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]);
}
Affiner le type des éléments
import { requireNoNilElements } from "apps-script-utils";
const values: Array<string | null> = readColumn();
const names: string[] = requireNoNilElements(values, "the column has empty cells");
Ce qui passe et ce qui lève
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
Voir aussi
compact — retire les valeurs vides au lieu de les rejeter.