题目链接:Pick
内容实现参考B站视频:type-challenges本地刷题环境搭建 & easy-pick的实现
题目实现:
实现一个类型Pick<T, K>
,从T属性中任意选择一系列的属性形成K
测试:
import type { 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
}
JS实现
- 函数
myPick
接收两个参数,一个是接口类型todo
,一个是选择的属性keys
- 返回值:对象obj
- 过程:
1.返回一个对象
2.遍历
3. todo[key]取值
4. 判断key是否在todo中
function myPick(todo,keys){
const obj = {}
keys.forEach(key => {
if(key in todo){
obj[key] = todo[key]
}
});
return obj
}
TS实现
- keys相当于K,在TS中为联合类型(union)
- 遍历联合类型:
[P in K]
- TS中对K进行约束,即K一定是存在T中:
K extends keyof T
type MyPick<T, K extends keyof T> = {
[P in K]:T[P]
}
总结
-
TS中的遍历
Mapped Types -
todo[key]的取值
Indexed Access Types -
取出接口中的所有key,也就是取出对象中的所有值
Keyof Type Operator -
类型约束
Generic Constraints