TypeScript和JavaScript的区别,全面解读超详细(二)

news/2024/7/5 2:56:48

了解基础篇:请跳转

3.4.3 TS的编译

点击跳转 TypeScript和JavaScript的区别,全面解读超详细
我们知道.js的文件可以直接在浏览器中运行的,而.ts或者.tsx却不行,所以我们在运行TS项目时需要编译成浏览器引擎可以识别的JS语言。同时为了提高编译速度,我们可以将稳定的module提前编译成js文件放到工程中,这样下次编译就会直接跳过该nodule的编译。在引用编译生成的 JavaScript 文件时,我们需要注意好顺序。以上面的代码为例,我们在 Html 代码中这么引用。

<script src="Validation.js" type="text/javascript"/>
<script src="LettersOnlyValidator.js" type="text/javascript"/>
<script src="ZipCodeValidator.js" type="text/javascript"/>
<script src="Test.js" type="text/javascript"/>

在这里插入图片描述

时光使我们渐行渐远,有人活着却没有理想,就宛如在地狱,有人活着却满怀理想,就宛如在天堂,没有理想的人如同行尸走肉,对生活而感到不精彩,无味,而我是一个对生命充满希望,永不放弃,为理想而拼搏的人


4.TS 高级类型

更新日期:2022年11月30日
更新时间:20点46分

4.1 元组

提到元组,我们一定要搞清楚它和数组的区别,或者他和数组的关系,混淆两者等于是浪费我们宝贵的时间,所以一定要学懂

元组可以看做是数组的拓展,它表示已知元素数量和类型的数组。确切地说,是已知数组中每一个位置上的元素的类型

你读懂这句话了吗,数组元素的类型

let tuple: [string, number, boolean];
tuple = ["a", 2, false];
tuple = [2, "a", false]; // error 不能将类型“number”分配给类型“string”。 不能将类型“string”分配给类型“number”。
tuple = ["a", 2]; // error Property '2' is missing in type '[string, number]' but required in type '[string, number, boolean]'
tuple = ["a", 2, false,"parm"] //在 2.6 及之前版本中,超出规定个数的元素"parm"称作越界元素

可以看到,上面我们定义了一个元组 tuple,它包含三个元素,且每个元素的类型是固定的。当我们为 tuple 赋值时:各个位置上的元素类型都要对应,元素个数也要一致。

当某个方法具有多个类型的参数时,我们可以封装为一个元组,学过java、c# 的同学可能懂了,元组是一种更加简单的bean

  • 给单个元素赋值
tuple[1] = 3;
tuple[2] = true;

在 2.6 之后的版本,[string, number]元组类型的声明效果上可以看做等同于下面的声明:

interface Tuple extends Array<number | string> {
  0: string; //第一个变量为string类型
  1: number; //第二个变量为number类型
  length: 2; // array的长度为2
}

接口Tuple,它继承数组类型,并且数组元素的类型是 number 和 string 构成的联合类型,这样接口Tuple 就拥有了数组类型所有的特性。并且我们明确指定索引为0的值为string类型,索引为1的值为number类型,同时我们指定 length 属性的类型字面量为 2,这样当我们再指定一个类型为这个接口Tuple的时候,这个值必须是数组,而且如果元素个数超过2个时,它的length就不是2是大于2的数了,就不满足这个接口定义了,所以就会报错。

元组里面有一个员宇宙,他有各种各样的元素,他是充实的,它对数量有限制。而数组里面是孤独的,他只有一种元素,它对数量没有限制。这样的解释只是为了帮你记住元组而不是理解元素。不过学过paython的同学一定懂得元组是什么,同时元组也是数据库的底层的一种类型。

4.2 交叉类型

交叉类型就是取多个类型的并集,使用 & 符号定义,被&符链接的多个类型构成一个交叉类型,表示这个类型同时具备这几个连接起来的类型的特点,来看例子:
T & U

const merge = <T, U>(arg1: T, arg2: U): T & U => {
  let res = <T & U>{}; // 这里指定返回值的类型兼备T和U两个类型变量代表的类型的特点
  res = Object.assign(arg1, arg2); // 这里使用Object.assign方法,返回一个合并后的对象;
                                   // 关于该方法,请在例子下面补充中学习
  return res;
};
const info1 = {
  name: "lison"
};
const info2 = {
  age: 18
};
const lisonInfo = merge(info1, info2);
 
console.log(lisonInfo.address); // error 类型“{ name: string; } & { age: number; }”上不存在属性“address”
 

Object.assign方法可以合并多个对象,将多个对象的属性添加到一个对象中并返回,有一点要注意的是,如果属性值是对象或者数组这种保存的是内存引用的引用类型,会保持这个引用,也就是如果在Object.assign返回的的对象中修改某个对象属性值,原来用来合并的对象也会受到影响

可以看到,传入的两个参数分别是带有属性 name 和 age 的两个对象,所以它俩的交叉类型要求返回的对象既有 name 属性又有 age 属性。学到这里你似乎感觉到typescript 名称的缘由了,就是各种各样的类型的;如果说JavaScript是一门像java的语言,那么TypeScript才是真正完成了这项使命,即面向对象的前端编程语言。

4.3 联合类型

联合类型实际是几个类型的结合,但是和交叉类型不同,联合类型是要求只要符合联合类型中任意一种类型即可,它使用 | 符号定义。当我们的程序具有多样性,元素类型不唯一时,即使用联合类型。
T | U
string | number

const getLength = (content: string | number): number => {
  if (typeof content === "string") return content.length;
  else return content.toString().length;
};
console.log(getLength("abc")); // 3
console.log(getLength(123)); // 3

其实元组、交叉类型、联合类型都是一种动态的高级类型,联合类型有点类似any类型,但它的元素类型范围是有明确声明的。

高级类型暂介绍到这里,文章持续更新,记得收藏。


http://lihuaxi.xjx100.cn/news/362302.html

相关文章

Git入门教程

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 在团队开发中git是必不可少的,它是目前为止最流行的版本控制工具 Git是免费、开源的,由Linux之父花了两周时间写出来的(人与人之间的差距怎么这么大!) b站狂神:有道无术、术尚…

<Python Tips> 2. 数据类型

开启Python ➜ ~ docker run --rm -ti python:alpine python Python 3.7.0 (default, Jul 4 2018, 02:26:27) [GCC 6.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>Python对…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.4 流控效果【warm up】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.4 流控效果【warm up】31.4.1 流控效果31.4.2 流控效果 - warm up31.4.3 案例31 限…

笔试强训(四十一)

目录一、选择题二、编程题2.1 Emacs计算器2.1.1 题目2.1.1 题解一、选择题 &#xff08;1&#xff09;某主机的IP地址为180.80.77.55&#xff0c;子网掩码为255.255.252.0.若该主机向其所在子网发送广播分组&#xff0c;则目的地址可以是&#xff08;D&#xff09; A.180.80.7…

如何实现jwt鉴权机制?

一、是什么 JWT&#xff08;JSON Web Token&#xff09;&#xff0c;本质就是一个字符串书写规范&#xff0c;如下图&#xff0c;作用是用来在用户和服务器之间传递安全可靠的信息 在目前前后端分离的开发过程中&#xff0c;使用token鉴权机制用于身份验证是最常见的方案&…

周末福利 | 21天学通Python完整版,豆瓣评分9.6!

前言 又到了周末啦&#xff0c;小编例行给大家发福利&#xff01; 今天福利的内容是21天学通Python完整版&#xff0c;这是一本豆瓣评分9.6的人工智能入门书籍&#xff01;全面、系统、深入地讲解了Python编程基础语法与高级应用。在讲解过程中&#xff0c;通过大量实际操作的…

MySQL 运算符

目录 1. 算术运算符&#xff1a; - * / div % mod 练习&#xff1a; 2. 比较运算符 2.1 <> <> ! < < > > 的使用 <> &#xff1a;安全等于。 记忆技巧&#xff1a;为NULL而生。 #练习&#xff1a;查询表中commission_pct为…

如何搭建SLAM开发环境?

1-1|安装ubuntu和ros 「Ubuntu&ROS」安装Ubuntu系统教程|1-1 「Ubuntu&ROS」Ubuntu系统下搭建深度学习和SLAM开发环境教程|1-2 1-2|g++编译流程 「Ubuntu&ROS」Ubuntu系统下CMake教程|1-5 1-3|CMake编译流程 1-4|Git代码版本控制 「Ubuntu&ROS」U…