TypeScript 挑战(一)- 实现Pick

记录下学习过程

题目是这样的


无需使用内置的Pick<T, K>泛型即可。

通过从K中选择属性T来构造类型

例如

1
2
3
4
5
6
7
8
9
10
11
12
interface Todo {
title: string
description: string
completed: boolean
}

type TodoPreview = MyPick<Todo, 'title' | 'completed'>

const todo: TodoPreview = {
title: 'Clean room',
completed: false,
}

继续之前推荐大家去typescript官网的playground,因为里面提供了自动语法检测的功能

比如上面的题目,可以去这里,点击这里打开就能跳转过去

默认情况下,测试用例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* _____________ 测试用例 _____________ */
import { Equal, Expect } from '@type-challenges/utils'

type cases = [
Expect<Equal<Expected1, MyPick<Todo, 'title'>>>,
Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,
// @ts-expect-error
MyPick<Todo, 'title' | 'completed' | 'invalid'>,
]

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

interface Expected1 {
title: string
}

interface Expected2 {
title: string
completed: boolean
}

然后需要我们完成的代码如下

1
2
3
/* _____________ 你的代码 _____________ */

type MyPick<T, K> = any

只要完成“你的代码部分”,测试用例部分的错误提示就会消失

答案我公布下,参考别人的

这个值得仔细斟酌下,我感觉我都看不懂了

1
type MyPick<T, K extends number | string | symbol> = { [k in K]: k extends keyof T ? T[k] : never}