Skip to content

热身与 Easy

type-challenges 的 warm-up + easy 共 14 题。这里收录 8 道最代表性的。

TIP

每题限时 15 分钟。做不出来直接展开答案,看懂后默写一遍。

Easy4 · 实现 Pick查看答案

实现 MyPick<T, K>,从 T 中选出属性 K。不能使用内置的 Pick

ts
interface Todo {
  title: string
  description: string
  completed: boolean
}

type TodoPreview = MyPick<Todo, 'title' | 'completed'>
// 期望 { title: string; completed: boolean }
Easy7 · 实现 Readonly查看答案

实现 MyReadonly<T>,让所有属性变成只读。

ts
interface Todo {
  title: string
}
const todo: MyReadonly<Todo> = { title: 'x' }
todo.title = 'y' // 应该报错
Easy14 · First of Array查看答案

实现 First<T>,取元组的第一个元素类型。

ts
type A = First<[3, 2, 1]> // 3
type B = First<[]> // never
Easy18 · Length of Tuple查看答案

实现 Length<T>,返回元组的长度。

ts
type A = Length<[1, 2, 3]> // 3
Easy43 · 实现 Exclude查看答案

实现 MyExclude<T, U>,从联合 T 中剔除可以赋值给 U 的成员。

ts
type A = MyExclude<'a' | 'b' | 'c', 'a'> // 'b' | 'c'
Easy189 · 实现 Awaited查看答案

实现 MyAwaited<T>,取出 Promise 的内容类型(支持嵌套)。

ts
type A = MyAwaited<Promise<string>> // string
type B = MyAwaited<Promise<Promise<number>>> // number
Easy268 · 实现 If查看答案

实现 If<C, T, F>Ctrue 返回 T,否则返回 F

ts
type A = If<true, 'a', 'b'> // 'a'
type B = If<false, 'a', 'b'> // 'b'
Easy3057 · 实现 Push查看答案

实现 Push<T, U>,往元组末尾追加一个类型。

ts
type A = Push<[1, 2], 3> // [1, 2, 3]

刷完这些之后

如果这 8 题你都能独立写出来,说明已经过了"前 10 题发懵"的阶段。继续 Medium 精选

基于 VitePress 与 Twoslash 构建