阅读 89

Typescript 类型体操

|&的区别

经过实验

IProps1 & IProps2 : 取并集

IProps1 | IProps2 = Partical<IProps1 & IProps2>

实现真正的「或」逻辑

我们会发现,编写类型时使用的 | 并不是我们理解的

interface IProps1 {   firstName: string   lastName: string } interface IProps2 {   fullName: string } type IPerson = IProps1 | IProps2 期望:ts报错 实际:通过ts校验 const p1 = {   firstName: 'jenson',   lastName: 'liu',   fullName: 'jensonliu' } 复制代码

我也不知道这是设计失误还是设计本意,如果想模拟出真正的逻辑,还是需要一点黑科技的。

思路

使用never类型

interface IProps1 {   firstName: string   lastName: string   fullName?: never } interface IProps2 {   firstName?: never   lastName?: never   fullName: string } type IPerson = IProps1 | IProps2 复制代码

这就是手动告诉编译器,fullName存在时firstNamelastName都为never,反之亦然

改进

当然,我们不能对每个interface都去手动写never,因此可以抽取成通用的类型方法

type ExcludeToNever<T, V> = {   [P in keyof Omit<V, keyof T>]?: never; // V中存在而T中不存在的属性 } & {   [P in keyof T]: T[P]; // T的原有属性 }; 复制代码

ExcludeToNever传入两个interface,即T和V, 将V中存在而T中不存在的属性设置为never并塞入T中

然后

type IOr<F, S> = ExcludeToNever<F, S> | ExcludeToNever<S, F> 复制代码

这样一来就将两个interface中彼此不存在的key都用never填充了


作者:一个大冰球
链接:https://juejin.cn/post/7016627699414204447


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐