题目
实现 TS 内置的 Pick
从类型 T 中选择出属性 K,构造成一个新的类型。
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyPick<Todo, 'title' | 'completed'>
const todo: TodoPreview = {
title: 'Clean room',
completed: false,
}
单元测试
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
}
通过 JS 解题
function myPick (todo, keys) {
const obj = {};
keys.forEach(key => {
if(key in todo){
obj[key] = todo[key];
}
});
return obj;
}
知识点
- = {}
- 遍历 foreach
- P in K
- todo[key] 取值
- T[P]
- 看看 key 在不在 todo 里面
- keyof
union 联合类型
- K extends keyof T
- 增加约束 Constraints