import {expectType} from 'tsd'; import type {ArrayTail} from '../index.d.ts'; declare const getArrayTail: (array: T) => ArrayTail; expectType<[]>(getArrayTail([] as [])); expectType<[]>(getArrayTail(['a'] as ['a'])); expectType<['b', 'c']>(getArrayTail(['a', 'b', 'c'] as ['a', 'b', 'c'])); expectType(getArrayTail([] as const)); expectType(getArrayTail(['a'] as const)); expectType(getArrayTail(['a', 'b', 'c'] as const)); // Optional elements expectType(getArrayTail(['a', undefined, 'c'] as readonly ['a', undefined, 'c'?])); expectType<[undefined?, number?]>(getArrayTail(['hello'] as [string, undefined?, number?])); expectType(getArrayTail([1, undefined, 3] as readonly [1, undefined?, 3?])); expectType<[boolean, number?, string?]>(getArrayTail(['test', false] as [string, boolean, number?, string?])); // All optional elements expectType<['b'?]>({} as ArrayTail<['a'?, 'b'?]>); expectType({} as ArrayTail); // Rest element expectType({} as ArrayTail); // Required & Rest expectType({} as ArrayTail); // Optional & Rest expectType({} as ArrayTail); // Required, Optional & Rest // expectType({} as ArrayTail); // Rest & Required expectType({} as ArrayTail); // Required, Rest & Required // Labelled tuples expectType<[y: string]>({} as ArrayTail<[x: number, y: string]>); expectType<[bar: string, ...rest: boolean[]]>({} as ArrayTail<[foo: number, bar: string, ...rest: boolean[]]>); expectType<[...rest: boolean[], foo: number, bar: string]>({} as ArrayTail<[...rest: boolean[], foo: number, bar: string]>); // Union of tuples expectType<[] | ['b']>({} as ArrayTail<[] | ['a', 'b']>); expectType({} as ArrayTail); expectType<[number] | readonly [boolean, string?]>({} as ArrayTail<[string, number] | readonly [number, boolean, string?]>); expectType({} as ArrayTail); // Non tuple arrays expectType({} as ArrayTail); expectType({} as ArrayTail); expectType({} as ArrayTail); expectType({} as ArrayTail); // Boundary cases expectType({} as ArrayTail); expectType({} as ArrayTail);