type TupleTransform<T extends any[]> = { [K in keyof T]:
K extends "length" ? T[K] :
K extends keyof any[] ? Array<() => T[number]>[K] :
() => T[K]
}
conditional types
const tupleTransformer: TupleTransform<[string, number]> = [() => 'a', () => 5] //okay
const t0: () => string = tupleTransformer[0]
const t1: () => number = tupleTransformer[1]
const len: 2 = tupleTransformer.length;
const mapped: (string | number)[] = tupleTransformer.map(x => x());