TypeScript 挑战(一)- 实现Pick<T, K>

记录下学习过程

题目是这样的


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

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

例如

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

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

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

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

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

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

/* _____________ 测试用例 _____________ */
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
}

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

/* _____________ 你的代码 _____________ */

type MyPick<T, K> = any

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

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

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

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