Omit是什么?
Omit是typescript3.5新增的一个辅助类型,它的作用主要是:以一个类型为基础支持剔除某些属性,然后返回一个新类型。
type UserState { name: string age: number avatar?: string sex: boolean } // 当我定义这个Person的时候,我不希望有localtion这个属性,就可以这样写 type Person = Omit<UserState, 'avatar'> // 等价于 type Person { name: string age: number sex: boolean } 复制代码
如何直接用typescript实现Omit
实现 Omit<T, K>
不使用 Omit 实现 TypeScript 的 Omit<T, K> 范型。
Omit 会创建一个省略 K 中字段的 T 对象。
例如:
type UserState { name: string age: number avatar?: string sex: boolean // !1 女 !0 男 } // 当我定义这个Person的时候,我不希望有localtion这个属性,就可以这样写 type Person = TOmit<UserState, 'avatar'> const my: Person = { name: '小何', age: 18, sex: !0 } 复制代码
使用Pick和Exclude组合实现
pick
在某些应用场景下,我们可能需要从一个已声明的类型中抽取出一个子类型,在子类型中包含父类型中的部分或全部属性,这时我们可以使用Pick来实现
Exclude
与Pick相反,Pick用于拣选出我们需要关心的属性,而Exclude用于排除掉我们不需要关心的属性
// 使用Pick和Exclude组合实现 type TOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> type UserState { name: string age: number avatar?: string sex: boolean // !1 女 !0 男 } // 表示忽略掉User接口中的age和email属性 type Person = TOmit<userState, "avatar"> // 等价于 // 等价于 type Person { name: string age: number sex: boolean } let User: Person = { name: '小河', age: 18, sex: !0 } // 或者直接使用Exclude实现排除 type TOmit<T, K> = { [P in Exclude<keyof T,K>]: T[P] } 复制代码
在上述示例中,我们需要忽略掉Person接口中的avatar属性,则只需要将接口名和属性传入TOmit即可,对于其他类型也是如此,大大提高了类型的可扩展能力,方便复用。