繪畫世界

对今天面试的问到 TS 如何排除某个属性的一些想法

今天面试官问到一个“如何排除某个属性”,当时脑子一抽,听到排除就想到了 Exclude 事后问面试官才知道想要得知的答案是 Omit,真是。。。

不过 Exclude 也的确能排除属性啊,虽然他是排除变体用的,但是也能排除属性,比如:

type A = {
    x: number
    y: number
    z: number
}
type B = {
    [P in Exclude<keyof B, 'x'>]: A[P]
}

这样写不就排除咯,恰好这也是 Omit 的实现,不知道这算不算狡辩,滑稽

#TS 内置类型工具实现原理

TS 所有内置的类型工具都是基于 extendsinferkeyof 关键字以及-? 语法实现的,比如 Exclude 便是基于 extends 实现的。

type Exclude<T, U> = T extends U ? never : T

泛形 T 是一个联合类型,例如 A | B | C 这样表示其有三个变体,分别是 ABC。泛形对于联合类型会进行传入每个变体然后重新收集,当返回 never 则被遗弃,例如:

type A = 'a' | 'b' | 'c'
type M = {
  'a': 'aa',
  'b': never,
  'c': 'cc'
}
type K<T> = T extends keyof M ? M[T] : never;
type Result = K<A> // 'aa' | 'cc'

Exclude 做的便是如果 T 和 U 存在相似则返回 never 排除,否则返回变体本身,这样就排除了某个变体。

可惜咯,不过也不清楚为啥感觉迷迷糊糊的,难道是昨天一点才睡的缘故,也有可能是自己学艺不精啊,唉,不知道今天有面试,只能可惜了

生活

497 Words

上一篇: 不知道更换博客主题是为了什么

下一篇: 排查 Linux 磁盘占满的原因