知识运用:
- 什么是Omit?
- 如何遍历联合类型?
- 使用内置的Exclude。
题目分析:
题目地址:3-medium-omit
如上图所示,我们需要实现的通用类型工具的要求需要满足可以将传入的对象在忽略掉指定key的字段后再返回输出。
题目解答:
测试用例:
我们的测试用例需要满足按需省略掉对象中存在的属性,当需要省略的属性不存在时将会抛出错误。
/* _____________ 测试用例 _____________ */ import { Equal, Expect } from '@type-challenges/utils' type cases = [ Expect<Equal<Expected1, MyOmit<Todo, 'description'>>>, Expect<Equal<Expected2, MyOmit<Todo, 'description' | 'completed'>>> ] // @ts-expect-error type error = MyOmit<Todo, 'description' | 'invalid'> interface Todo { title: string description: string completed: boolean } interface Expected1 { title: string completed: boolean } interface Expected2 { title: string } 复制代码
答案及解析:
- 观察测试用例,我们传入的K有两个特点,一个是K必须存在T中,另一个是需要使用keyof来得到T中属性组成的联合类型。
- 接着我们需要使用内置的Exclude来从T的属性组成的联合类型中排除K的存在。
- 通过in来遍历剩余的属性,并通过索引类型访问来读取每个U的值,最后组成一个U:T[U]。
/* _____________ 你的代码 _____________ */ type MyOmit<T, K extends keyof T> = { [U in Exclude<keyof T, K>]: T[U] } 复制代码