From f6b13876597c29a5a8b9eba302613f7a2742071e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Fern=C3=A1ndez?= Date: Mon, 2 Dec 2024 13:21:01 +0100 Subject: [PATCH] `ArrayTail`: Fix support for optional parameters (#977) Co-authored-by: som-sm --- source/array-tail.d.ts | 6 +++++- test-d/array-tail.ts | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/source/array-tail.d.ts b/source/array-tail.d.ts index efac9c497..088408408 100644 --- a/source/array-tail.d.ts +++ b/source/array-tail.d.ts @@ -22,4 +22,8 @@ add3(4); @category Array */ -export type ArrayTail = TArray extends readonly [unknown, ...infer Tail] ? Tail : []; +export type ArrayTail = TArray extends readonly [unknown?, ...infer Tail] + ? keyof TArray & `${number}` extends never + ? [] + : Tail + : []; diff --git a/test-d/array-tail.ts b/test-d/array-tail.ts index af6418bfe..b4c12572c 100644 --- a/test-d/array-tail.ts +++ b/test-d/array-tail.ts @@ -10,3 +10,17 @@ expectType<[]>(getArrayTail(['a', 'b', 'c'])); expectType<[]>(getArrayTail([] as const)); expectType<[]>(getArrayTail(['a'] as const)); expectType<['b', 'c']>(getArrayTail(['a', 'b', 'c'] as const)); + +// Optional elements tests +expectType<[undefined, 'c']>(getArrayTail(['a', undefined, 'c'] as const)); + +// Mixed optional/required +type MixedArray = [string, undefined?, number?]; +expectType<[undefined?, number?]>(getArrayTail(['hello'] as MixedArray)); + +// Optional numbers +expectType<[undefined, 3]>(getArrayTail([1, undefined, 3] as const)); + +// Complex mixed case +type ComplexArray = [string, boolean, number?, string?]; +expectType<[boolean, number?, string?]>(getArrayTail(['test', false] as ComplexArray));