Fix index-as-message bug in assertArray

As `assertArray` previously called the assertion
function in a `forEach(assertion)`, the index was
passed as the custom message. This commit fixes
this bug by passing down the `message` argument
to the assertion function.

A `@ts-expect-error` comment was added to due to
"Assertions require every name in the call target
to be declared with an explicit type
annotation.".
This commit is contained in:
Martin Eneqvist 2024-09-06 09:56:14 +02:00
parent ab85d9bca9
commit d77be18d42
2 changed files with 10 additions and 3 deletions

View file

@ -1143,14 +1143,17 @@ export function assertAny(predicate: Predicate | Predicate[], ...values: unknown
}
}
export function assertArray<T = unknown>(value: unknown, assertion?: (element: unknown) => asserts element is T, message?: string): asserts value is T[] {
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));
}
if (assertion) {
// eslint-disable-next-line unicorn/no-array-for-each, unicorn/no-array-callback-reference
value.forEach(assertion);
// eslint-disable-next-line unicorn/no-array-for-each
value.forEach(v => {
// @ts-expect-error: "Assertions require every name in the call target to be declared with an explicit type annotation."
assertion(v, message);
});
}
}

View file

@ -773,6 +773,10 @@ test('is.array', t => {
x[0]?.toFixed(0);
}
});
t.throws(() => {
assert.array([1, '2'], assert.number, 'Expected numbers');
}, {message: /Expected numbers/});
});
test('is.function', t => {