Skip to content

Instantly share code, notes, and snippets.

@jcalz
Last active February 9, 2018 16:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jcalz/9aa61fc36279f00270c58ffe997bd0af to your computer and use it in GitHub Desktop.
Save jcalz/9aa61fc36279f00270c58ffe997bd0af to your computer and use it in GitHub Desktop.
Array destructuring helper (producing tuples up to length 9)
function arrayDestruct
(obj: any): never[];
function arrayDestruct<T, K0 extends keyof T>
(obj: T, k0: K0): [T[K0]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T>
(obj: T, k0: K0, k1: K1): [T[K0], T[K1]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2): [T[K0], T[K1], T[K2]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2): [T[K0], T[K1], T[K2]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2, k3: K3): [T[K0], T[K1], T[K2], T[K3]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T,
K4 extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2, k3: K3, k4: K4): [T[K0], T[K1], T[K2], T[K3], T[K4]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T,
K4 extends keyof T, K5 extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): [T[K0], T[K1], T[K2], T[K3], T[K4], T[K5]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T,
K4 extends keyof T, K5 extends keyof T, K6 extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6):
[T[K0], T[K1], T[K2], T[K3], T[K4], T[K5], T[K6]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T,
K4 extends keyof T, K5 extends keyof T, K6 extends keyof T, K7 extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, k7: K7):
[T[K0], T[K1], T[K2], T[K3], T[K4], T[K5], T[K6], T[K7]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T,
K4 extends keyof T, K5 extends keyof T, K6 extends keyof T, K7 extends keyof T, K8 extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, k7: K7, k8: K8):
[T[K0], T[K1], T[K2], T[K3], T[K4], T[K5], T[K6], T[K7], T[K8]];
function arrayDestruct<T, K0 extends keyof T, K1 extends keyof T, K2 extends keyof T, K3 extends keyof T,
K4 extends keyof T, K5 extends keyof T, K6 extends keyof T, K7 extends keyof T, K8 extends keyof T,
Krest extends keyof T>
(obj: T, k0: K0, k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, k7: K7, k8: K8, ...krest: Krest[]):
T[K0 | K1 | K2 | K3 | K4 | K5 | K6 | K7 | K8 | Krest][] & {
0: T[K0], 1: T[K1], 2: T[K2], 3: T[K3], 4: T[K4], 5: T[K5],
6: T[K6], 7: T[K7], 8: T[K8], 9: T[Krest]
};
function arrayDestruct<T, K extends keyof T>(obj: T, ...keys: K[]): T[K][] {
return keys.map(k => obj[k]);
}
const obj = { foo: "y", bar: 1, baz: true };
const tuple = arrayDestruct(obj, 'baz', 'foo', 'bar'); // [boolean, string, number]
tuple[0] === true
tuple[1].charAt(0);
tuple[2]-1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment