|
| 1 | +import {expectType} from 'tsd'; |
| 2 | +import type {TupleToObject} from '../source/tuple-to-object'; |
| 3 | + |
| 4 | +// Tuples |
| 5 | +expectType<TupleToObject<[]>>({} as {}); |
| 6 | +expectType<TupleToObject<[number]>>({} as {0: number}); |
| 7 | +expectType<TupleToObject<[number, string]>>({} as {0: number; 1: string}); |
| 8 | +expectType<TupleToObject<[number | string, {foo: string}]>>({} as {0: number | string; 1: {foo: string}}); |
| 9 | +expectType<TupleToObject<[number, string?]>>({} as {0: number; 1?: string}); |
| 10 | +expectType<TupleToObject<[number?, string?, boolean?]>>({} as {0?: number; 1?: string; 2?: boolean}); |
| 11 | + |
| 12 | +// Readonly tuples |
| 13 | +expectType<TupleToObject<readonly []>>({} as {}); |
| 14 | +expectType<TupleToObject<readonly [number, string]>>({} as {readonly 0: number; readonly 1: string}); |
| 15 | +expectType<TupleToObject<readonly [number, string?, boolean?]>>({} as {readonly 0: number; readonly 1?: string; readonly 2?: boolean}); |
| 16 | + |
| 17 | +// Non-tuples |
| 18 | +expectType<TupleToObject<number[]>>({} as Record<number, number>); |
| 19 | +expectType<TupleToObject<[...boolean[]]>>({} as Record<number, boolean>); |
| 20 | +expectType<TupleToObject<[number, string, ...boolean[]]>>({} as {[x: number]: number | string | boolean; 0: number; 1: string}); |
| 21 | +expectType<TupleToObject<[number, string?, ...boolean[]]>>({} as {[x: number]: number | string | boolean | undefined; 0: number; 1?: string}); |
| 22 | +expectType<TupleToObject<[...number[], string, bigint]>>({} as Record<number, number | string | bigint>); |
| 23 | +expectType<TupleToObject<never[]>>({} as Record<number, never>); |
| 24 | +expectType<TupleToObject<any[]>>({} as Record<number, any>); |
| 25 | + |
| 26 | +// Readonly non-tuples |
| 27 | +expectType<TupleToObject<readonly number[]>>({} as Readonly<Record<number, number>>); |
| 28 | +expectType<TupleToObject<readonly [number, string?, ...boolean[]]>>({} as {readonly [x: number]: number | string | boolean | undefined; readonly 0: number; readonly 1?: string}); |
| 29 | +expectType<TupleToObject<readonly [...number[], string, bigint]>>({} as Readonly<Record<number, number | string | bigint>>); |
| 30 | + |
| 31 | +// Unions |
| 32 | +expectType<TupleToObject<[number] | [number, string, boolean]>>( |
| 33 | + {} as {0: number} | {0: number; 1: string; 2: boolean}, |
| 34 | +); |
| 35 | +expectType<TupleToObject<[number?, string?] | [] | [number, string, ...number[]]>>( |
| 36 | + {} as {0?: number; 1?: string} | {} | {[x: number]: number | string; 0: number; 1: string}, |
| 37 | +); |
| 38 | +expectType<TupleToObject<Array<number | undefined> | string[]>>( |
| 39 | + {} as Record<number, number | undefined> | Record<number, string>, |
| 40 | +); |
| 41 | +expectType<TupleToObject<[number, string] | readonly string[]>>( |
| 42 | + {} as {0: number; 1: string} | Readonly<Record<number, string>>, |
| 43 | +); |
| 44 | +expectType<TupleToObject<readonly [string] | readonly [number?] | number[]>>( |
| 45 | + {} as {readonly 0: string} | {readonly 0?: number} | Record<number, number>, |
| 46 | +); |
| 47 | +expectType<TupleToObject<[...number[], string] | [number?, string?, ...number[]]>>( |
| 48 | + {} as Record<number, string | number> | {[x: number]: string | number | undefined; 0?: number; 1?: string}, |
| 49 | +); |
| 50 | + |
| 51 | +// Labeled tuples |
| 52 | +expectType<TupleToObject<[x: string, y: number]>>({} as {0: string; 1: number}); |
| 53 | +expectType<TupleToObject<[first: string, ...rest: number[]]>>({} as {[x: number]: string | number; 0: string}); |
| 54 | +expectType<TupleToObject<[...rest: number[], last: string]>>({} as Record<number, string | number>); |
| 55 | +expectType<TupleToObject<readonly [name: string, age?: number]>>({} as {readonly 0: string; readonly 1?: number}); |
| 56 | + |
| 57 | +// Boundary types |
| 58 | +expectType<TupleToObject<any>>({} as any); |
| 59 | +expectType<TupleToObject<never>>({} as never); |
| 60 | + |
| 61 | +// @ts-expect-error only works with arrays |
| 62 | +type T = TupleToObject<{}>; |
0 commit comments