问题 #
不使用 Omit 实现 TypeScript 的 Omit<T, K> 泛型。
Omit 会创建一个省略 K 中字段的 T 对象。
例如:
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyOmit<Todo, 'description' | 'title'>
const todo: TodoPreview = {
completed: false,
}解答 #
type MyExclude<T, U> = T extends U ? never : T
type MyOmit<T, K extends keyof T> = { [P in MyExclude<keyof T, K>]: T[P] }拆分 #
Omit和Pick类似,但是又不一样- 首先需要先从
T中排除K中的字段,所以需要确认T中的字段是否在K中,使用K extends keyof T确认 - 获取
T中不在K中的字段,使用Exclude<keyof T, K>获取 Keyof T解析出来的结果是title|description|completed,然后用Exclude<keyof T, K>排除K中的字段,得到completed- 所以相当于
{ [P in completed]: T[P] }