|
| 1 | +import {expectType} from 'tsd'; |
| 2 | +import type {ArrayReverse} from '../source/array-reverse.d.ts'; |
| 3 | + |
| 4 | +// Empty & single-element tuples |
| 5 | +expectType<[]>({} as ArrayReverse<[]>); |
| 6 | +expectType<readonly []>({} as ArrayReverse<readonly []>); |
| 7 | +expectType<[string]>({} as ArrayReverse<[string]>); |
| 8 | +expectType<readonly [number]>({} as ArrayReverse<readonly [number]>); |
| 9 | +expectType<[any]>({} as ArrayReverse<[any]>); |
| 10 | +expectType<[never]>({} as ArrayReverse<[never]>); |
| 11 | + |
| 12 | +// Only required elements |
| 13 | +expectType<[3, 2, 1]>({} as ArrayReverse<[1, 2, 3]>); |
| 14 | +expectType<readonly [string, number, boolean, bigint]>({} as ArrayReverse<readonly [bigint, boolean, number, string]>); |
| 15 | +expectType<['a' | 1, 2, 'c' | 3]>({} as ArrayReverse<['c' | 3, 2, 'a' | 1]>); |
| 16 | + |
| 17 | +// Required and rest element |
| 18 | +expectType<readonly [...string[], 3, 2, 1]>({} as ArrayReverse<readonly [1, 2, 3, ...string[]]>); // Rest element at the end |
| 19 | +expectType<['z', 'y', 'x', ...boolean[], 3, 2, 1]>({} as ArrayReverse<[1, 2, 3, ...boolean[], 'x', 'y', 'z']>); // Rest element in the middle |
| 20 | +expectType<readonly [string, ...bigint[]]>({} as ArrayReverse<readonly [...bigint[], string]>); // Rest element at the start |
| 21 | + |
| 22 | +// Required and optional elements |
| 23 | +expectType<[3, 2, 1] | [2, 1]>({} as ArrayReverse<[1, 2, 3?]>); |
| 24 | +expectType<readonly [3, 2, 1] | readonly [2, 1] | readonly [1]>({} as ArrayReverse<readonly [1, 2?, 3?]>); |
| 25 | +expectType<[number, boolean, bigint, number, string] | [boolean, bigint, number, string] | [bigint, number, string] | [number, string]>( |
| 26 | + {} as ArrayReverse<[string, number, bigint?, boolean?, number?]>, |
| 27 | +); |
| 28 | + |
| 29 | +// Only optional elements |
| 30 | +expectType<['a'] | []>({} as ArrayReverse<['a'?]>); |
| 31 | +expectType<readonly [{data: string[]}] | readonly []>({} as ArrayReverse<readonly [{data: string[]}?]>); |
| 32 | +expectType<[bigint, boolean, string] | [boolean, string] | [string] | []>({} as ArrayReverse<[string?, boolean?, bigint?]>); |
| 33 | + |
| 34 | +// Required, optional, and rest element |
| 35 | +expectType<[...string[], 3, 2, 1] | [2, 1]>({} as ArrayReverse<[1, 2, 3?, ...string[]]>); |
| 36 | +expectType<readonly [...string[], string, number] | readonly [number]>({} as ArrayReverse<readonly [number, string?, ...string[]]>); |
| 37 | + |
| 38 | +// Optional and rest element |
| 39 | +expectType<readonly [...string[], 1] | readonly []>({} as ArrayReverse<readonly [1?, ...string[]]>); |
| 40 | +expectType<[...number[], 3, 2, 1] | [2, 1] | [1] | []>({} as ArrayReverse<[1?, 2?, 3?, ...number[]]>); |
| 41 | + |
| 42 | +// Nested tuples |
| 43 | +expectType<[6, 5, [3, 4], [1, 2]]>({} as ArrayReverse<[[1, 2], [3, 4], 5, 6]>); |
| 44 | +expectType<[Array<{y: string}>, Array<{x: string}>]>({} as ArrayReverse<[Array<{x: string}>, Array<{y: string}>]>); |
| 45 | +expectType<[3, [1, 2]] | [[1, 2]] | []>({} as ArrayReverse<[[1, 2]?, 3?]>); |
| 46 | + |
| 47 | +// Unions |
| 48 | +expectType<[3, 2, 1] | readonly ['b', 'a']>({} as ArrayReverse<[1, 2, 3] | readonly ['a', 'b']>); |
| 49 | +expectType<readonly [number, string] | number[]>({} as ArrayReverse<readonly [string, number] | number[]>); |
| 50 | +expectType<readonly [3, 2, 1] | readonly [2, 1] | readonly [1] | ['b', 'a'] | ['a'] | [] | [number, string]>( |
| 51 | + {} as ArrayReverse<readonly [1, 2?, 3?] | ['a'?, 'b'?] | [string, number]>, |
| 52 | +); |
| 53 | + |
| 54 | +// Labelled tuples |
| 55 | +expectType<[number, number]>({} as ArrayReverse<[x: number, y: number]>); |
| 56 | +expectType<readonly [number, string] | readonly [string]>({} as ArrayReverse<readonly [x: string, y?: number]>); |
| 57 | +expectType<[...number[], string]>({} as ArrayReverse<[x: string, ...rest: number[]]>); |
| 58 | + |
| 59 | +// Non-tuple arrays |
| 60 | +expectType<string[]>({} as ArrayReverse<string[]>); |
| 61 | +expectType<readonly number[]>({} as ArrayReverse<readonly number[]>); |
| 62 | +expectType<ReadonlyArray<number | bigint>>({} as ArrayReverse<ReadonlyArray<number | bigint>>); |
| 63 | +expectType<any[]>({} as ArrayReverse<any[]>); |
| 64 | +expectType<never[]>({} as ArrayReverse<never[]>); |
| 65 | + |
| 66 | +// Boundary cases |
| 67 | +expectType<never>({} as ArrayReverse<never>); |
| 68 | +expectType<any>({} as ArrayReverse<any>); |
0 commit comments