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
浙公网安备 33010602011771号