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}
版权声明
由 durban创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.gowhich.com ),版权所有,侵权必究。
版权声明
由 durban创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 Gowhich博客( https://www.gowhich.com ),版权所有,侵权必究。