热身与 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<[]> // neverEasy18 · Length of Tuple查看答案
实现 Length<T>,返回元组的长度。
ts
type A = Length<[1, 2, 3]> // 3Easy43 · 实现 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>>> // numberEasy268 · 实现 If查看答案
实现 If<C, T, F>:C 为 true 返回 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 精选。