TypeScript细碎知识点:循环中的键值判断,as 关键字使用

🐡 需求: Omit 会创建一个省略 K 中字段的 T 对象。

这和 Pick 很像,只是结果相反,Pick 是挑选需要的字段,而 Omit 则是排除指定的字段

🤔 思考:根据现了解的关键字, keyof 肯定要用,可是怎么排除其他的键?
😊 思路:用 never 来做键,就能在这个字段值排除了

所以就引出了第一个问题 如何在对象的循环中给键值做判断?

先看答案:

type MyOmit<T, K extends keyof T> = {
  [P in keyof T as P extends K ? never : P]: T[P]
}

K extends keyof T 这些语法就不解释了。关键就在于 P extends K ? never : P 判断 P 这个键是否属于 K 的范围,属于的则是要排除的,返回 nerver,不属于的就需要返回当前的 P,代表把当前的键保留下来

看到这里又引出第二个问题 P in keyof as any extends P 是什么意思?

加一些括号好理解一下

[
  (P in keyof T) as
  (P extends K ? never : P)
]

以 as 为分界,把这段代码分为 2 段

  • P in keyof T 是遍历的意思,这个好理解
  • as 在这里姑且认定为是 断言
  • P extends K ? never : P 这里是为了判断类型

连起来怎么看

  • P 在 T 的范围循环
  • P 得到的是 T 中的键
  • 对于这个 P 我们为他断言 为 P / never
  • 如果 P 的这个键在 K 的范围中,我们就断言当前的 P 是 never(抛弃原先 P 的值),那么在对象循环的时候 never 就会被忽略掉,从而实现 Omit

posted on 2024-11-18 13:17  梁飞宇  阅读(23)  评论(0)    收藏  举报