Skip to content

Instantly share code, notes, and snippets.

View cartant's full-sized avatar

Nicholas Jamieson cartant

View GitHub Profile
const result = combine(["a", "b"]);
// string[]
declare function combine<Elements extends unknown[]>(
...inputs: [...Inputs<Elements>]
): Elements[number][];
declare function combine<Elements extends unknown[]>(
...inputsAndCount: [...Inputs<Elements>, number]
): Elements[number][];
declare function combine<Elements extends unknown[]>(
...inputsAndCountAndDir: [...Inputs<Elements>, number, "left" | "right"]
): Elements[number][];
const result = combine(["a", "b"]);
// unknown[]
const result = combine(["a", "b"], [1, 2], 2, "right");
// (string | number)[]
declare function combine<Elements extends unknown[]>(
...inputsAndCountAndDir: [...Inputs<Elements>, number, "left" | "right"]
): Elements[number][];declare function combine<Elements extends unknown[]>(
...inputsAndCount: [...Inputs<Elements>, number]
): Elements[number][];
declare function combine<Elements extends unknown[]>(
...inputs: [...Inputs<Elements>]
): Elements[number][];
const result = combine(["a", "b"], [1, 2], 2);
// (string | number)[]
declare function combine<Elements extends unknown[]>(
...inputsAndCount: [...Inputs<Elements>, number]
): Elements[number][];declare function combine<Elements extends unknown[]>(
...inputs: [...Inputs<Elements>]
): Elements[number][];
const result = combine(["a", "b"], [1, 2]);
// (string | number)[]
type Element0 = [string, number][0];
// string
type Element1 = [string, number][1];
// number
type All = [string, number][number];
// string | number
type Mapped = Inputs<[string, number]>;
// [readonly string[], readonly number[]];