问题 #
不使用 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] }