Unbox
约 314 字大约 1 分钟
2026-02-11
题目
How can we build a type that "unboxes" arrays, functions, promises, and tuples?
Example:
Unbox<string> // string
Unbox<()=>number> // number
Unbox<boolean[]> // boolean
Unbox<Promise<boolean>> // booleanBonus: Can we make it recursive?
Unbox<() => () => () => () => number> // numberDouble Bonus: Can we control the recursion?
Unbox<() => () => () => () => number, 3> // () => number解题思路
待补充
答案
type Unbox<T> = any验证
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
// Base cases
Expect<Equal<Unbox<number>, number>>,
Expect<Equal<Unbox<() => number>, number>>,
Expect<Equal<Unbox<() => number | string>, number | string>>,
Expect<Equal<Unbox<number[]>, number>>,
Expect<Equal<Unbox<(number | string)[]>, number | string>>,
Expect<Equal<Unbox<[number]>, number>>,
Expect<Equal<Unbox<Promise<number>>, number>>,
// Bonus: Recursion
Expect<Equal<Unbox<() => Promise<() => Array<Promise<boolean>>>>, boolean>>,
// Bonus: Recursion levels
Expect<Equal<Unbox<() => () => () => () => number, 0>, number>>,
Expect<Equal<Unbox<() => () => () => () => number, 1>, () => () => () => number>>,
Expect<Equal<Unbox<() => () => () => () => number, 2>, () => () => number>>,
Expect<Equal<Unbox<() => () => () => () => number, 3>, () => number>>,
Expect<Equal<Unbox<() => () => () => () => number, 4>, number>>,
Expect<Equal<Unbox<() => () => () => () => number, 5>, number>>,
Expect<Equal<Unbox<number[][][][], 0>, number>>,
Expect<Equal<Unbox<number[][][][], 1>, number[][][]>>,
Expect<Equal<Unbox<number[][][][], 2>, number[][]>>,
Expect<Equal<Unbox<number[][][][], 3>, number[]>>,
Expect<Equal<Unbox<number[][][][], 4>, number>>,
Expect<Equal<Unbox<number[][][][], 5>, number>>,
Expect<Equal<Unbox<[[[[number]]]], 0>, number>>,
Expect<Equal<Unbox<[[[[number]]]], 1>, [[[number]]]>>,
Expect<Equal<Unbox<[[[[number]]]], 2>, [[number]]>>,
Expect<Equal<Unbox<[[[[number]]]], 3>, [number]>>,
Expect<Equal<Unbox<[[[[number]]]], 4>, number>>,
Expect<Equal<Unbox<[[[[number]]]], 5>, number>>,
Expect<Equal<Unbox<Promise<Promise<Promise<number>>>, 0>, number>>,
Expect<Equal<Unbox<Promise<Promise<Promise<number>>>, 1>, Promise<Promise<number>>>>,
Expect<Equal<Unbox<Promise<Promise<Promise<number>>>, 2>, Promise<number>>>,
Expect<Equal<Unbox<Promise<Promise<Promise<number>>>, 3>, number>>,
Expect<Equal<Unbox<Promise<Promise<Promise<number>>>, 4>, number>>,
]参考
无
