【类型挑战】实现 Omit,难度⭐️⭐️

简介: 【类型挑战】实现 Omit,难度⭐️⭐️

知识运用:


  1. 什么是Omit
  2. 如何遍历联合类型?
  3. 使用内置的Exclude。


题目分析:


题目地址:3-medium-omitimage.png

如上图所示,我们需要实现的通用类型工具的要求需要满足可以将传入的对象在忽略掉指定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
}
复制代码


答案及解析:

  1. 观察测试用例,我们传入的K有两个特点,一个是K必须存在T中,另一个是需要使用keyof来得到T中属性组成的联合类型。
  2. 接着我们需要使用内置的Exclude来从T的属性组成的联合类型中排除K的存在。
  3. 通过in来遍历剩余的属性,并通过索引类型访问来读取每个U的值,最后组成一个U:T[U]。
/* _____________ 你的代码 _____________ */
type MyOmit<T, K extends keyof T> = {
  [U in Exclude<keyof T, K>]: T[U]
}
复制代码


去演练场验证答案



相关文章
|
C语言
C语言练级之路(num6)10个基础小题目等你来挑战
首先今天有点迟了,原因就是去看了一下别的大佬的有关十六进制转八进制的博客,看的我现在人都有点不正常,要不是我目前还不会写,我觉得有的博主的写法我属实不能理解,等我哪天研究会了,……
|
测试技术 索引
【类型挑战】最后一个元素,难度⭐️⭐️
【类型挑战】最后一个元素,难度⭐️⭐️
121 0
【类型挑战】最后一个元素,难度⭐️⭐️
|
测试技术
【类型挑战】深度 Readonly,难度⭐️⭐️
【类型挑战】深度 Readonly,难度⭐️⭐️
318 0
【类型挑战】深度 Readonly,难度⭐️⭐️
|
机器学习/深度学习 存储 容器
【综合笔试题】1044. 最长重复子串 : 两种强有力的字符串处理方式
【综合笔试题】1044. 最长重复子串 : 两种强有力的字符串处理方式
|
JavaScript 前端开发 测试技术
【类型挑战】出栈,难度⭐️⭐️
【类型挑战】出栈,难度⭐️⭐️
149 0
【类型挑战】出栈,难度⭐️⭐️
|
测试技术
【类型挑战】Readonly 2,难度⭐️⭐️
【类型挑战】Readonly 2,难度⭐️⭐️
152 0
【类型挑战】Readonly 2,难度⭐️⭐️
|
测试技术
【类型挑战】If,难度⭐️
【类型挑战】If,难度⭐️
114 0
【类型挑战】If,难度⭐️
|
前端开发 测试技术
【类型挑战】Awaited,难度⭐️
【类型挑战】Awaited,难度⭐️
135 0
【类型挑战】Awaited,难度⭐️
|
测试技术 API
【类型挑战】元组转联合,难度⭐️⭐️
【类型挑战】元组转联合,难度⭐️⭐️
179 0
【类型挑战】元组转联合,难度⭐️⭐️
|
测试技术
【类型挑战】Unshift,难度⭐️
【类型挑战】Unshift,难度⭐️
116 0
【类型挑战】Unshift,难度⭐️