|
| 1 | +import {expectType} from 'tsd'; |
| 2 | +import type {ArrayLength, Primitive} from '../index.d.ts'; |
| 3 | + |
| 4 | +// Non-tuples |
| 5 | +expectType<number>({} as ArrayLength<unknown[]>); |
| 6 | + |
| 7 | +// Tuples |
| 8 | +expectType<0>({} as ArrayLength<[]>); |
| 9 | +expectType<1>({} as ArrayLength<[never]>); |
| 10 | +expectType<3>({} as ArrayLength<['one', 2, true]>); |
| 11 | +expectType<2 | 3 | 4>({} as ArrayLength<[number, string, boolean?, boolean?]>); |
| 12 | + |
| 13 | +expectType<number>({} as ArrayLength<[1, 2, ...unknown[]]>); |
| 14 | +expectType<number>({} as ArrayLength<[1, 2?, ...unknown[]]>); |
| 15 | +expectType<number>({} as ArrayLength<[...unknown[], 1, 2]>); |
| 16 | +expectType<number>({} as ArrayLength<[0, ...unknown[], 1, 2]>); |
| 17 | + |
| 18 | +// Read-only arrays |
| 19 | +expectType<number>({} as ArrayLength<readonly unknown[]>); |
| 20 | +expectType<number>({} as ArrayLength<readonly never[]>); |
| 21 | +expectType<0>({} as ArrayLength<readonly []>); |
| 22 | +expectType<1>({} as ArrayLength<readonly [never]>); |
| 23 | +expectType<3>({} as ArrayLength<readonly ['one', 2, true]>); |
| 24 | +expectType<2 | 3 | 4>({} as ArrayLength<readonly [number, string, boolean?, boolean?]>); |
| 25 | + |
| 26 | +expectType<number>({} as ArrayLength<readonly [1, 2, ...unknown[]]>); |
| 27 | +expectType<number>({} as ArrayLength<readonly [1, 2?, ...unknown[]]>); |
| 28 | +expectType<number>({} as ArrayLength<readonly [...unknown[], 1, 2]>); |
| 29 | +expectType<number>({} as ArrayLength<readonly [0, ...unknown[], 1, 2]>); |
| 30 | + |
| 31 | +// Unions |
| 32 | +expectType<0 | 2>({} as ArrayLength<[] | [1, 2]>); |
| 33 | +expectType<0 | 2>({} as ArrayLength<readonly [] | readonly [1, 2]>); |
| 34 | +expectType<0 | 2>({} as ArrayLength<[] | readonly [1, 2]>); |
| 35 | +expectType<1 | 2 | 3 | 4>({} as ArrayLength<[1, 2?, 3?] | ['one', 'two', 'three', 'four']>); |
| 36 | +expectType<number>({} as ArrayLength<readonly [1] | [1, ...number[]]>); |
| 37 | + |
| 38 | +// Edge cases and disallowed types |
| 39 | +expectType<never>({} as ArrayLength<never>); |
| 40 | +expectType<any>({} as ArrayLength<any>); |
| 41 | + |
| 42 | +// @ts-expect-error |
| 43 | +type DisallowedPrimitive = ArrayLength<string>; |
| 44 | +// @ts-expect-error |
| 45 | +type DisallowedPrimitives = ArrayLength<Primitive>; |
| 46 | +// @ts-expect-error |
| 47 | +type DisallowedObject = ArrayLength<{}>; |
| 48 | +// @ts-expect-error |
| 49 | +type DisallowedMap = ArrayLength<Map<string, number>>; |
| 50 | +// @ts-expect-error |
| 51 | +type DisallowedSet = ArrayLength<Set<number>>; |
| 52 | +// @ts-expect-error |
| 53 | +type DisallowedRecord = ArrayLength<Record<string, unknown>>; |
| 54 | +// @ts-expect-error |
| 55 | +type DisallowedObjectWithLength = ArrayLength<{length: number}>; |
0 commit comments