Last active
December 10, 2018 13:32
-
-
Save chenyong/70ea3732dcac4f1157efa846b4cad314 to your computer and use it in GitHub Desktop.
A stupid Optional Chaining alternative in TypeScript, demo https://streamable.com/vnyap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// get | |
export function safeGet<T, K1 extends keyof T>(x: T, k1: K1): T[K1] { | |
if (x != null) { | |
return x[k1]; | |
} | |
return null; | |
} | |
export function safeGet2<T, K1 extends keyof T, K2 extends keyof (T[K1])>(x: T, k1: K1, k2: K2) { | |
if (x != null) { | |
let target = x[k1]; | |
if (target != null) { | |
return target[k2]; | |
} | |
} | |
return null; | |
} | |
export function safeGet3<T, K1 extends keyof T, K2 extends keyof (T[K1]), K3 extends keyof (T[K1][K2])>(x: T, k1: K1, k2: K2, k3: K3) { | |
if (x != null) { | |
let target = x[k1]; | |
if (target != null) { | |
let target2 = target[k2]; | |
if (target2 != null) { | |
return target2[k3]; | |
} | |
} | |
} | |
return null; | |
} | |
export function safeGet4<T, K1 extends keyof T, K2 extends keyof (T[K1]), K3 extends keyof (T[K1][K2]), K4 extends keyof (T[K1][K2][K3])>( | |
x: T, | |
k1: K1, | |
k2: K2, | |
k3: K3, | |
k4: K4 | |
) { | |
if (x != null) { | |
let target = x[k1]; | |
if (target != null) { | |
let target2 = target[k2]; | |
if (target2 != null) { | |
let target3 = target2[k3]; | |
if (target3 != null) { | |
return target3[k4]; | |
} | |
} | |
} | |
} | |
return null; | |
} | |
// set | |
export function safeSet<T, K1 extends keyof T>(x: T, k1: K1, v: T[K1]) { | |
x[k1] = v; | |
} | |
export function safeSet2<T, K1 extends keyof T, K2 extends keyof (T[K1])>(x: T, k1: K1, k2: K2, v: T[K1][K2]) { | |
if (x[k1] == null) { | |
x[k1] = {} as any; | |
} | |
x[k1][k2] = v; | |
} | |
export function safeSet3<T, K1 extends keyof T, K2 extends keyof (T[K1]), K3 extends keyof (T[K1][K2])>(x: T, k1: K1, k2: K2, k3: K3, v: T[K1][K2][K3]) { | |
if (x[k1] == null) { | |
x[k1] = {} as any; | |
} | |
if (x[k1][k2] == null) { | |
x[k1][k2] = {} as any; | |
} | |
x[k1][k2][k3] = v; | |
} | |
export function safeSet4<T, K1 extends keyof T, K2 extends keyof (T[K1]), K3 extends keyof (T[K1][K2]), K4 extends keyof (T[K1][K2][K3])>( | |
x: T, | |
k1: K1, | |
k2: K2, | |
k3: K3, | |
k4: K4, | |
v: T[K1][K2][K3][K4] | |
) { | |
if (x[k1] == null) { | |
x[k1] = {} as any; | |
} | |
if (x[k1][k2] == null) { | |
x[k1][k2] = {} as any; | |
} | |
if (x[k1][k2][k3] == null) { | |
x[k1][k2][k3] = {} as any; | |
} | |
x[k1][k2][k3][k4] = v; | |
} | |
// alias | |
export function safeProp<T, K1 extends keyof T, K2 extends keyof (T[K1]), K3 extends keyof (T[K1][K2]), K4 extends keyof (T[K1][K2][K3])>( | |
x: T, | |
k1: K1, | |
k2?: K2, | |
k3?: K3, | |
k4?: K4 | |
) { | |
if (x != null) { | |
let target = x[k1]; | |
if (k2 == null) { | |
return target; | |
} | |
if (target != null) { | |
let target2 = target[k2]; | |
if (k3 == null) { | |
return target2; | |
} | |
if (target2 == null) { | |
let target3 = target2[k3]; | |
if (k4 == null) { | |
return target3; | |
} | |
if (target3 != null) { | |
return target3[k4]; | |
} | |
} | |
} | |
} | |
return null; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment