实现 Omit
题目
不使用 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,
}
题目来源:https://tsch.js.org/3/zh-CN
解答
type MyExclude<T, K> = T extends K ? never : T;
type MyOmit<T, K extends keyof T> = {
[P in MyExclude<keyof T, K>]: T[P]
}
取出Omit<T, K>
中,T的差集(T-K)
type MyExclude<T, K> = T extends K ? never : T;
将MyOmit<T, K>
中的T
,转换成联合类型,即keyof T
。
然后,传入MyExclude
中,筛选出差集。
遍历差集,生成新的type
[P in MyExclude<keyof T, K>]: T[P]
: 使用in
,对差集结果进行遍历,输出即可。