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交叉运算的资料请关注脚本之家其它相关文章!

相关文章

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

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

    这篇文章主要为大家介绍了与ChatGPT结对编写实现代码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • js 获取今天以及过去日期

    js 获取今天以及过去日期

    这篇文章主要介绍了js获得当前系统日期时间以及过去系统日期时间的方法,涉及javascript操作日期时间的相关技巧,示例代码如下,需要的朋友可以参考下
    2017-04-04
  • typescript难学吗?前端有必要学?该怎么学typescript

    typescript难学吗?前端有必要学?该怎么学typescript

    TypeScript代码与 JavaScript 代码有非常高的兼容性,无门槛,你把 JS 代码改为 TS 就可以运行。TypeScript 应该不会脱离 JavaScript 成为独立的语言。学习 TypeScript 应该主要指的是学习它的类型系统。
    2022-12-12
  • DS-SDK封装ThreeJS的三维场景核心库Viewer

    DS-SDK封装ThreeJS的三维场景核心库Viewer

    这篇文章主要为大家介绍了基于DS-SDK封装ThreeJS的三维场景核心库Viewer封装示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • type challenge刷题之(middle 部分)示例解析

    type challenge刷题之(middle 部分)示例解析

    这篇文章主要为大家介绍了type challenge刷题之(middle 部分)示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 微信小程序实现图片预加载组件

    微信小程序实现图片预加载组件

    预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。下面这篇文章主要介绍了微信小程序实现图片预加载组件的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 开发typescript项目tsconfig.json配置及选项使用解析

    开发typescript项目tsconfig.json配置及选项使用解析

    这篇文章主要为大家介绍了tsconfig.json配置及选项使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • TypeScript数据结构之队列结构Queue教程示例

    TypeScript数据结构之队列结构Queue教程示例

    这篇文章主要为大家介绍了TypeScript数据结构之队列结构Queue教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • PureScript与JavaScript中equality设计的使用对比分析

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

    这篇文章主要为大家介绍了PureScript中的equality与JavaScript中的equality设计对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • TypeScript中的函数重载示例分析

    TypeScript中的函数重载示例分析

    这篇文章主要为大家介绍了TypeScript中的函数重载示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论