Add is.optional and assert.optional

Fixes #111
This commit is contained in:
Sindre Sorhus 2025-09-13 02:27:50 +07:00
parent c68ad76062
commit 1f2440ae0d
3 changed files with 76 additions and 0 deletions

View file

@ -318,6 +318,7 @@ const is = Object.assign(
urlInstance: isUrlInstance,
urlSearchParams: isUrlSearchParams,
urlString: isUrlString,
optional: isOptional,
validDate: isValidDate,
validLength: isValidLength,
weakMap: isWeakMap,
@ -342,6 +343,10 @@ export function isAny(predicate: Predicate | Predicate[], ...values: unknown[]):
);
}
export function isOptional<T>(value: unknown, predicate: (value: unknown) => value is T): value is T | undefined {
return isUndefined(value) || predicate(value);
}
export function isArray<T = unknown>(value: unknown, assertion?: (value: T) => value is T): value is T[] {
if (!Array.isArray(value)) {
return false;
@ -940,11 +945,19 @@ type Assert = {
// Variadic functions.
any: (predicate: Predicate | Predicate[], ...values: unknown[]) => void | never;
all: (predicate: Predicate, ...values: unknown[]) => void | never;
/**
Asserts that `value` is `undefined` or satisfies the provided `assertion`.
Useful for optional inputs.
*/
optional: <T>(value: unknown, assertion: (value: unknown, message?: string) => asserts value is T, message?: string) => asserts value is T | undefined;
};
export const assert: Assert = {
all: assertAll,
any: assertAny,
optional: assertOptional,
array: assertArray,
arrayBuffer: assertArrayBuffer,
arrayLike: assertArrayLike,
@ -1148,6 +1161,12 @@ export function assertAny(predicate: Predicate | Predicate[], ...values: unknown
}
}
export function assertOptional<T>(value: unknown, assertion: (value: unknown, message?: string) => asserts value is T, message?: string): asserts value is T | undefined {
if (!isUndefined(value)) {
assertion(value, message);
}
}
export function assertArray<T = unknown>(value: unknown, assertion?: (element: unknown, message?: string) => asserts element is T, message?: string): asserts value is T[] {
if (!isArray(value)) {
throw new TypeError(message ?? typeErrorMessage('Array', value));