|
1 | 1 | import {expectType} from 'tsd'; |
2 | | -import type {ArrayTail, UnknownArray} from '../index.d.ts'; |
| 2 | +import type {ArrayTail} from '../index.d.ts'; |
3 | 3 |
|
4 | 4 | declare const getArrayTail: <T extends readonly unknown[]>(array: T) => ArrayTail<T>; |
5 | 5 |
|
6 | | -expectType<[]>(getArrayTail([])); |
7 | | -expectType<[]>(getArrayTail(['a'])); |
8 | | -expectType<[]>(getArrayTail(['a', 'b', 'c'])); |
| 6 | +expectType<[]>(getArrayTail([] as [])); |
| 7 | +expectType<[]>(getArrayTail(['a'] as ['a'])); |
| 8 | +expectType<['b', 'c']>(getArrayTail(['a', 'b', 'c'] as ['a', 'b', 'c'])); |
9 | 9 |
|
10 | | -expectType<[]>(getArrayTail([] as const)); |
11 | | -expectType<[]>(getArrayTail(['a'] as const)); |
12 | | -expectType<['b', 'c']>(getArrayTail(['a', 'b', 'c'] as const)); |
| 10 | +expectType<readonly []>(getArrayTail([] as const)); |
| 11 | +expectType<readonly []>(getArrayTail(['a'] as const)); |
| 12 | +expectType<readonly ['b', 'c']>(getArrayTail(['a', 'b', 'c'] as const)); |
13 | 13 |
|
14 | 14 | // Optional elements tests |
15 | | -expectType<[undefined, 'c']>(getArrayTail(['a', undefined, 'c'] as const)); |
| 15 | +expectType<readonly [undefined, 'c']>(getArrayTail(['a', undefined, 'c'] as const)); |
16 | 16 |
|
17 | 17 | // Mixed optional/required |
18 | 18 | type MixedArray = [string, undefined?, number?]; |
19 | 19 | expectType<[undefined?, number?]>(getArrayTail(['hello'] as MixedArray)); |
20 | 20 |
|
21 | 21 | // Optional numbers |
22 | | -expectType<[undefined, 3]>(getArrayTail([1, undefined, 3] as const)); |
| 22 | +expectType<readonly [undefined, 3]>(getArrayTail([1, undefined, 3] as const)); |
23 | 23 |
|
24 | 24 | // Complex mixed case |
25 | 25 | type ComplexArray = [string, boolean, number?, string?]; |
26 | 26 | expectType<[boolean, number?, string?]>(getArrayTail(['test', false] as ComplexArray)); |
27 | 27 |
|
28 | 28 | // All optional elements |
29 | 29 | expectType<['b'?]>([] as ArrayTail<['a'?, 'b'?]>); |
| 30 | +expectType<readonly [number?]>({} as ArrayTail<readonly [string?, number?]>); |
| 31 | + |
| 32 | +// Rest element |
| 33 | +expectType<readonly [number, boolean, ...string[]]>({} as ArrayTail<readonly [string, number, boolean, ...string[]]>); // Required & Rest |
| 34 | +expectType<readonly [number?, boolean?, ...string[]]>({} as ArrayTail<readonly [string?, number?, boolean?, ...string[]]>); // Optional & Rest |
| 35 | +expectType<readonly [number, boolean?, ...string[]]>({} as ArrayTail<readonly [string, number, boolean?, ...string[]]>); // Required, Optional & Rest |
| 36 | +// expectType<readonly [...string[], string, number]>({} as ArrayTail<readonly [...string[], string, number]>); // Rest & Required |
| 37 | +expectType<readonly [number, ...string[], boolean, bigint]>({} as ArrayTail<readonly [string, number, ...string[], boolean, bigint]>); // Required, Rest & Required |
30 | 38 |
|
31 | 39 | // Union of tuples |
32 | 40 | expectType<[] | ['b']>([] as ArrayTail<[] | ['a', 'b']>); |
33 | | -expectType<['y'?] | ['b', ...string[]] | []>([] as ArrayTail<readonly ['x'?, 'y'?] | ['a', 'b', ...string[]] | readonly string[]>); |
34 | | - |
35 | | -// `preserveReadonly` option |
36 | | -type ReadonlyPreservingArrayTail<Type extends UnknownArray> = ArrayTail<Type, {preserveReadonly: true}>; |
37 | | - |
38 | | -expectType<[]>({} as ReadonlyPreservingArrayTail<[]>); |
39 | | -expectType<readonly []>({} as ReadonlyPreservingArrayTail<readonly []>); |
40 | | -expectType<[number?, ...string[]]>({} as ReadonlyPreservingArrayTail<[string?, number?, ...string[]]>); |
41 | | -expectType<readonly [number?, ...string[]]>({} as ReadonlyPreservingArrayTail<readonly [string?, number?, ...string[]]>); |
42 | | - |
43 | | -expectType<[number] | readonly [boolean, string?]>({} as ReadonlyPreservingArrayTail<[string, number] | readonly [number, boolean, string?]>); |
44 | | -expectType<readonly [number] | readonly []>({} as ReadonlyPreservingArrayTail<readonly [string, number] | readonly string[]>); |
45 | | -expectType<[number?] | [boolean, string?] | []>({} as ReadonlyPreservingArrayTail<[string?, number?] | [number, boolean, string?] | [...string[], number]>); |
46 | | - |
47 | | -expectType<[]>({} as ReadonlyPreservingArrayTail<string[]>); |
48 | | -expectType<readonly []>({} as ReadonlyPreservingArrayTail<readonly string[]>); |
| 41 | +expectType<readonly ['y'?] | ['b', ...string[]] | readonly []>([] as ArrayTail<readonly ['x'?, 'y'?] | ['a', 'b', ...string[]] | readonly string[]>); |
| 42 | +expectType<[number] | readonly [boolean, string?]>({} as ArrayTail<[string, number] | readonly [number, boolean, string?]>); |
| 43 | +expectType<readonly [number] | readonly []>({} as ArrayTail<readonly [string, number] | readonly string[]>); |
| 44 | + |
| 45 | +// Non tuple arrays |
| 46 | +expectType<[]>({} as ArrayTail<string[]>); |
| 47 | +expectType<readonly []>({} as ArrayTail<readonly string[]>); |
| 48 | +expectType<[]>({} as ArrayTail<never[]>); |
| 49 | +expectType<[]>({} as ArrayTail<any[]>); |
0 commit comments