Skip to content

Instantly share code, notes, and snippets.

@Arlen22
Created June 26, 2017 23:12
Show Gist options
  • Save Arlen22/0a7d79bdaa2d2dc6f1221429fb9a52f5 to your computer and use it in GitHub Desktop.
Save Arlen22/0a7d79bdaa2d2dc6f1221429fb9a52f5 to your computer and use it in GitHub Desktop.
Tuple nonsense
interface TupleConstructor {
new <T0>(item0: T0)
: [T0];
new <T0, T1>(item0: T0, item1: T1)
: [T0, T1];
new <T0, T1, T2>(item0: T0, item1: T1, item2: T2)
: [T0, T1, T2];
new <T0, T1, T2, T3>(item0: T0, item1: T1, item2: T2, tem3: T3)
: [T0, T1, T2, T3];
new <T0, T1, T2, T3, T4>(item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4)
: [T0, T1, T2, T3, T4];
new <T0, T1, T2, T3, T4, T5>(item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5)
: [T0, T1, T2, T3, T4, T5];
new <T0, T1, T2, T3, T4, T5, T6>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6)
: [T0, T1, T2, T3, T4, T5, T6];
new <T0, T1, T2, T3, T4, T5, T6, T7>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6, item7: T7)
: [T0, T1, T2, T3, T4, T5, T6, T7];
new <T0, T1, T2, T3, T4, T5, T6, T7, T8>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8)
: [T0, T1, T2, T3, T4, T5, T6, T7, T8];
new <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9)
: [T0, T1, T2, T3, T4, T5, T6, T7, T8, T9];
new <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, TR extends any[]>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9, restTuple: TR
): [T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, TR[0], TR[1]] & TR;
//new <...TA>(...args: TA): ...TA;
}
const x: [number, string] = [0, "0"];
const y: [number, string] = [1, "1"];
//const z: [typeof ...x, typeof ...y] = [...x, ...y]; // Error (currently)
const z: [typeof x[0], typeof x[1], typeof y[0], typeof y[1]] = ; // Error (currently)
const Tuple: TupleConstructor = (((...args: any[]) => {
//it will never be more than one deep because function arguments are resolved
//before the function call
if (args.length === 11) {
return args.concat(args.pop());
} else {
return args;
}
}) as any) as TupleConstructor;
// class Tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> implements [T0, T1, T2, T3, T4, T5, T6, T7, T8, T9]{
// constructor(
// item0?: T0,
// item1?: T1,
// item2?: T2,
// item3?: T3,
// item4?: T4,
// item5?: T5,
// item6?: T6,
// item7?: T7,
// item8?: T8,
// item9?: T9,
// ) {
// return [item0, item1, item2, item3, item4, item5, item6, item7, item8, item9] as [T0, T1, T2, T3, T4, T5, T6, T7, T8, T9];
// }
// }
function newTuple<T0>(item0: T0)
: [T0];
function newTuple<T0, T1>(item0: T0, item1: T1)
: [T0, T1];
function newTuple<T0, T1, T2>(item0: T0, item1: T1, item2: T2)
: [T0, T1, T2];
function newTuple<T0, T1, T2, T3>(item0: T0, item1: T1, item2: T2, tem3: T3)
: [T0, T1, T2, T3];
function newTuple<T0, T1, T2, T3, T4>(item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4)
: [T0, T1, T2, T3, T4];
function newTuple<T0, T1, T2, T3, T4, T5>(item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5)
: [T0, T1, T2, T3, T4, T5];
function newTuple<T0, T1, T2, T3, T4, T5, T6>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6)
: [T0, T1, T2, T3, T4, T5, T6];
function newTuple<T0, T1, T2, T3, T4, T5, T6, T7>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6, item7: T7)
: [T0, T1, T2, T3, T4, T5, T6, T7];
function newTuple<T0, T1, T2, T3, T4, T5, T6, T7, T8>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8)
: [T0, T1, T2, T3, T4, T5, T6, T7, T8];
function newTuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9)
: [T0, T1, T2, T3, T4, T5, T6, T7, T8, T9];
function newTuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, TR>(
item0: T0, item1: T1, item2: T2, tem3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9, restTuple: TR
): [T0, T1, T2, T3, T4, T5, T6, T7, T8, T9] & TR;
function newTuple(...args: any[]): any {
//it will never be more than one deep because function arguments are resolved
//before the function call
if (args.length === 11) {
return args.concat(args.pop());
} else {
return args;
}
}
const test = new Tuple("", "", "", 0, "", "", "", "", "", false, new Tuple("", 0, "", "test" as "test", "test"));
var t0 = test[0]; // type: string
var t1 = test[1]; // type: string & number
var t2 = test[2]; // type: string
var t3 = test[3]; // type: string & "test"
var t4 = test[4]; // type: string
var t5 = test[5]; // type: string
var t6 = test[6]; // type: string
var t7 = test[7]; // type: string
var t8 = test[8]; // type: string
var t9 = test[9]; // type: string
var t10 = test[10]; // type: string | (string & number)
var t11 = test[11]; // type: string | (string & number)
var t12 = test[12]; // type: string | (string & number)
var t13 = test[13]; // type: string | (string & number)
var t14 = test[14]; // type: string | (string & number)
var t15 = test[15]; // type: string | (string & number)
var t16 = test[16]; // type: string | (string & number)
var t17 = test[17]; // type: string | (string & number)
// repeats t17 on up.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment