Skip to main content

实现 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,对差集结果进行遍历,输出即可。