TypeScript交叉运算的算法示例解析

 更新时间:2023年08月04日 11:10:47   作者:Qing  
这篇文章主要为大家介绍了TypeScript交叉运算的算法示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引文

相信只要接触过ts的同学就有了解交叉类型这两个概念,以前我对交叉类型感到非常疑惑,明明叫交叉类型,为何对对象类型使用了交叉运算后类型反而会进行属性的合并?不知道大家有没有和我一样的困惑。这篇文章我会分享我最近感悟到的用不同视角来解释出现上述问题的原因,如有错误,恳请指正。

交叉运算

在ts中,使用&这个符号来对两个类型进行交叉运算,下面举几个小例子来开始讲解。

例一

type A = number & string    // never

例二

type A = 1 & number                // 1
type B = "hello" & string          // "hello"

例三

type A1 = {a: number}
type A2 = {aa: string}

这里的例子正是我在引文中提到的情况,按照交叉这个字面意思来理解,{a: number}{aa: string}两个好像也没有什么交集,按照例一的思路来思考,结果应该是never,为何结果是{a: number, aa: string}

首先来思考一个问题,假设有这么几个对象:

{a: 1, b: 2}

{aa: "11", bb: "22"}

{a: 1, b: 2, aa: "11", bb: "22"}

这几个对象分别赋值给类型为A1、A2、A的变量,哪个类型的变量在被赋值的时候有比较大的可能会出现错误?

相信大家能够很容易的猜到答案,那就是上面的这三个对象在给类型为A的变量赋值的时候前两个对象都会报错,只有最后一个对象是符合类型要求的。

上述中的A1、A2类型,A1类型的变量只需要值中有属性名为a,属性值类型为number的属性即可满足,而A2类型的变量只需要值中有属性名为aa,属性值类型为string的属性即可满足,而A类型的变量对值的要求是必须要同时有a和aa这两个属性。

那么符合A1、A2、A类型的值各有几个?可以归类下

符合A1类型的值:{a: 1, b: 2}、{a: 1, b: 2, aa: "11", bb: "22"}

符合A2类型的值:{aa: "11", bb: "22"}、{a: 1, b: 2, aa: "11", bb: "22"}

符合A类型的值:{a: 1, b: 2, aa: "11", bb: "22"}

可以看到在A1 & A2后得到的A类型,其值相对于A1和A2这两个类型对应的值的范围是变小的,这也符合交叉运算的结果趋势。

我们对数学中的交并集运算有着很深的印象,但是数学上交并集运算作用的对象却是具体的数值,如果把这种思想转换到ts类型上来,其实不太合适,而是应该把这种思想作用到ts类型所对应的值上。

现在用这种思路去思考例一和例二,也是能够走通的。

交叉运算在处理对象类型的时候,交叉过后属性反而增多,初看觉得不对劲,但转换角度细想或许能发现其中的道理。

总结

交叉运算会导致能够赋值给结果类型的变量范围变小,这个类型的限制也会变得更严格。

以上就是TypeScript交叉运算示例解析的详细内容,更多关于TypeScript交叉运算的资料请关注脚本之家其它相关文章!

相关文章

  • d3-scale d3-scaleTime使用示例详解

    d3-scale d3-scaleTime使用示例详解

    这篇文章主要为大家介绍了d3-scale d3-scaleTime使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 适合面向ChatGPT编程的架构示例详解

    适合面向ChatGPT编程的架构示例详解

    这篇文章主要为大家介绍了适合面向ChatGPT编程的架构示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Three.js 粗糙度贴图与金属度贴图使用介绍

    Three.js 粗糙度贴图与金属度贴图使用介绍

    这篇文章主要为大家介绍了Three.js 粗糙度贴图与金属度贴图使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 与ChatGPT结对编程实现代码详解

    与ChatGPT结对编程实现代码详解

    这篇文章主要为大家介绍了与ChatGPT结对编写实现代码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • TypeScript类型编程中的extends和infer示例解析

    TypeScript类型编程中的extends和infer示例解析

    这篇文章主要为大家介绍了TypeScript类型编程中的extends和infer示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • typescript快速上手的基础知识篇

    typescript快速上手的基础知识篇

    静态类型的typescript与传统动态弱类型语言javascript不同,在执行前会先编译成javascript,因为它强大的type类型系统加持,能让我们在编写代码时增加更多严谨的限制。注意,它并不是一门全新的语言,所以并没有增加额外的学习成本
    2022-12-12
  • PureScript与JavaScript中equality设计的使用对比分析

    PureScript与JavaScript中equality设计的使用对比分析

    这篇文章主要为大家介绍了PureScript中的equality与JavaScript中的equality设计对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • TypeScript 泛型接口具体使用实战

    TypeScript 泛型接口具体使用实战

    这篇文章主要为大家介绍了TypeScript 泛型接口具体使用实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • TS报错Cannot find module 'xxx' or its corresponding type declarations解决

    TS报错Cannot find module 'xxx' or its correspo

    这篇文章主要为大家介绍了TS报错Cannot find module 'xxx' or its corresponding type declarations解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • TypeScript之Generics泛型类型学习

    TypeScript之Generics泛型类型学习

    这篇文章主要为大家介绍了TypeScript之Generics泛型类型学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论