【TypeScript学习打卡第一天】

介绍、常用类型

  • 一、介绍
    • 1.概念
    • 2.TypeScript 为什么要为 JS 添加类型支持?
    • 3.ts的优势
  • 二、ts初体验
    • 1.安装编译 TS 的工具包
    • 2.编译并运行 TS 代码
    • 3.简化运行 TS 的步骤
  • 三、常用类型
    • 1.类型注解
    • 2.常用基础类型概述
      • (1) 原始类型
      • (2) 数组类型
      • (3) 联合类型
      • (4) 类型别名
      • (5) 函数类型
      • (6) 对象类型
      • (7) 接口
        • 基本使用
        • interface(接口)和 type(类型别名)的对比
        • 继承
      • (8) 元组
      • (9) 类型推论
      • (10) 类型断言
      • (11) 字面量类型
      • (12) 枚举
        • 访问枚举成员
        • 数字枚举
        • 字符串枚举
        • 特点与比较
      • (13) any 类型
      • (14)typeof

一、介绍

1.概念

TypeScript(简称:TS)是 JavaScript 的超集(JS 有的 TS 都有)。
TypeScript = Type + JavaScript(在 JS 基础之上,为 JS 添加了类型支持)。
TypeScript 是微软开发的开源编程语言,可以在任何运行 JavaScript 的地方运行。
在这里插入图片描述
在这里插入图片描述

2.TypeScript 为什么要为 JS 添加类型支持?

背景:JS 的类型系统存在“先天缺陷”,JS 代码中绝大部分错误都是类型错误(Uncaught TypeError)。
问题:增加了找 Bug、改 Bug 的时间,严重影响开发效率。

从编程语言的动静来区分,TypeScript 属于静态类型的编程语言,JS 属于动态类型的编程语言。
静态类型:编译期做类型检查; 动态类型:执行期做类型检查。
代码编译和代码执行的顺序:1 编译 2 执行。
对于 JS 来说:需要等到代码真正去执行的时候才能发现错误(晚)。
对于 TS 来说:在代码编译的时候(代码执行前)就可以发现错误(早)。
并且,配合 VSCode 等开发工具,TS 可以提前到在编写代码的同时就发现代码中的错误,减少找 Bug、改 Bug 时间

3.ts的优势

更早(写代码的同时)发现错误,减少找 Bug、改 Bug 时间,提升开发效率。
程序中任何位置的代码都有代码提示,随时随地的安全感,增强了开发体验。
强大的类型系统提升了代码的可维护性,使得重构代码更加容易
支持最新的 ECMAScript 语法,优先体验最新的语法,让你走在前端技术的最前沿。
TS 类型推断机制,不需要在代码中的每个地方都显示标注类型,让你在享受优势的同时,尽量降低了成本。
除此之外,Vue 3 源码使用 TS 重写、Angular 默认支持 TS、React 与 TS 完美配合,TypeScript 已成为大中型前端
项目的首先编程语言

二、ts初体验

1.安装编译 TS 的工具包

问题:为什么要安装编译 TS 的工具包?
回答:Node.js/浏览器,只认识 JS 代码,不认识 TS 代码。需要先将 TS 代码转化为 JS 代码,然后才能运行。
安装命令:npm i -g typescript
验证是否安装成功:tsc –v(查看 typescript 的版本)

2.编译并运行 TS 代码

创建 hello.ts 文件(注意:TS 文件的后缀名为 .ts)。
将 TS 编译为 JS:在终端中输入命令,tsc hello.ts(此时,在同级目录中会出现一个同名的 JS 文件)。
执行 JS 代码:在终端中输入命令,node hello.js。
在这里插入图片描述
说明:所有合法的 JS 代码都是 TS 代码,有 JS 基础只需要学习 TS 的类型即可。
注意:由 TS 编译生成的 JS 文件,代码中就没有类型信息了。

3.简化运行 TS 的步骤

问题描述:每次修改代码后,都要重复执行两个命令,才能运行 TS 代码,太繁琐。
简化方式:使用 ts-node 包,直接在 Node.js 中执行 TS 代码。

安装命令:npm i -g ts-node(ts-node 包提供了 ts-node 命令)。
使用方式:ts-node hello.ts。
解释:ts-node 命令在内部偷偷的将 TS -> JS,然后,再运行 JS 代码。
并没有生成一个js文件,只是在内部偷偷转换成js文件并立马执行了

三、常用类型

TypeScript 是 JS 的超集,TS 提供了 JS 的所有功能,并且额外的增加了:类型系统。
所有的 JS 代码都是 TS 代码。
JS 有类型(比如,number/string 等),但是 JS 不会检查变量的类型是否发生变化。而 TS 会检查。
TypeScript 类型系统的主要优势:可以显示标记出代码中的意外行为,从而降低了发生错误的可能性。

1.类型注解

在这里插入图片描述
说明:代码中的 : number 就是类型注解。
作用:为变量添加类型约束。比如,上述代码中,约定变量 age 的类型为 number(数值类型)。
解释:约定了什么类型,就只能给变量赋值该类型的值,否则,就会报错
在这里插入图片描述

2.常用基础类型概述

可以将 TS 中的常用基础类型细分为两类:
JS 已有类型 和 TS 新增类型。

(1). JS 已有类型
原始类型:number/string/boolean/null/undefined/symbol。
对象类型:object(包括,数组、对象、函数等对象)。
(2). TS 新增类型
联合类型、自定义类型(类型别名)、接口、元组、字面量类型、枚举、void、any 等。

(1) 原始类型

number/string/boolean/null/undefined/symbol。
特点:简单。这些类型,完全按照 JS 中类型的名称来书写。
在这里插入图片描述

(2) 数组类型

对象类型:object(包括,数组、对象、函数等对象)。
特点:对象类型,在 TS 中更加细化,每个具体的对象都有自己的类型语法

在这里插入图片描述

在这里插入图片描述

(3) 联合类型

需求:数组中既有 number 类型,又有 string 类型,这个数组的类型应该如何写?
在这里插入图片描述
解释:| (竖线)在 TS 中叫做联合类型(由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种)。
注意:这是 TS 中联合类型的语法,只有一根竖线,不要与 JS 中的或(||)混淆了。

(4) 类型别名

类型别名(自定义类型):为任意类型起别名。使用场景:当同一类型(复杂)被多次使用时,可以通过类型别名,简化该类型的使用

在这里插入图片描述

  1. 使用 type 关键字来创建类型别名。
  2. 类型别名(比如,此处的 CustomArray),可以是任意合法的变量名称。
  3. 创建类型别名后,直接使用该类型别名作为变量的类型注解即可

(5) 函数类型

函数的类型实际上指的是:函数参数返回值的类型。
为函数指定类型的两种方式:

  1. 单独指定参数、返回值的类型:
    在这里插入图片描述
  2. 同时指定参数、返回值的类型:
    解释:当函数作为表达式时,可以通过类似箭头函数形式的语法来为函数添加类型。
    注意:这种形式只适用于函数表达式
    在这里插入图片描述
  3. 如果函数没有返回值,那么,函数返回值类型为:void。
    在这里插入图片描述
  4. 可选参数

使用函数实现某个功能时,参数可以传也可以不传。这种情况下,在给函数参数指定类型时,就用到可选参数了。比如,数组的 slice 方法,可以 slice() 也可以 slice(1) 还可以 slice(1, 3)

在这里插入图片描述
可选参数:在可传可不传的参数名称后面添加 ?(问号)。
注意:可选参数只能出现在参数列表的最后,也就是说可选参数后面不能再出现必选参数。

(6) 对象类型

JS 中的对象是由属性和方法构成的,而 TS 中对象的类型就是在描述对象的结构(有什么类型的属性和方法)。

  1. 对象类型的写法:
    在这里插入图片描述
    解释:
    直接使用{}来描述对象结构。属性采用属性名: 类型的形式;方法采用方法名(): 返回值类型的形式。
    如果方法有参数,就在方法名后面的小括号中指定参数类型(比如:greet(name: string): void)。
    在一行代码中指定对象的多个属性类型时,使用 ;(分号)来分隔。
    如果一行代码只指定一个属性类型(通过换行来分隔多个属性类型),可以去掉 ;(分号)
    方法的类型也可以使用箭头函数形式(比如:{ sayHi: () => void })。
  2. 可选属性

对象的属性或方法,也可以是可选的,此时就用到可选属性了。
比如,我们在使用 axios({ … }) 时,如果发送 GET 请求,method 属性就可以省略。

在这里插入图片描述

(7) 接口

当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的。

基本使用
  1. 使用 interface 关键字来声明接口。
  2. 接口名称(比如,此处的 IPerson),可以是任意合法的变量名称。
  3. 声明接口后,直接使用接口名称作为变量的类型
  4. 因为每一行只有一个属性类型,因此,属性类型后没有 ;(分号)。
    在这里插入图片描述
interface(接口)和 type(类型别名)的对比

相同点:都可以给对象指定类型。
不同点:
接口,只能为对象指定类型。
在这里插入图片描述

类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名。
在这里插入图片描述

继承

如果两个接口之间有相同的属性或方法,可以将公共的属性或方法抽离出来,通过继承来实现复用。

在这里插入图片描述

  1. 使用 extends(继承)关键字实现了接口 Point3D 继承 Point2D。
  2. 继承后,Point3D 就有了 Point2D 的所有属性和方法(此时,Point3D 同时有 x、y、z 三个属性)

(8) 元组

元组类型可以确切地知道包含多少个元素,以及特定索引对应的类型。

在这里插入图片描述

(9) 类型推论

TS 中,某些没有明确指出类型的地方,TS 的类型推论机制会帮助提供类型

  1. 声明变量并初始化时
    在这里插入图片描述

  2. 决定函数返回值时
    在这里插入图片描述
    这两种情况下,类型注解可以省略不写,不知道类型,可以通过鼠标放在变量名称上,利用 VSCode 的提示来查看类型

(10) 类型断言

有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型。

在这里插入图片描述
getElementById 方法返回值的类型是 HTMLElement,该类型只包含所有标签公共的属性或方法,不包含 a 标签特有的 href 等属性
解决方式:这种情况下就需要使用类型断言指定更加具体的类型
在这里插入图片描述

解释:

  1. 使用 as 关键字实现类型断言。
  2. 关键字 as 后面的类型是一个更加具体的类型(HTMLAnchorElement 是 HTMLElement 的子类型)。
  3. 通过类型断言,aLink 的类型变得更加具体,这样就可以访问 a 标签特有的属性或方法了。

技巧:在浏览器控制台,通过 console.dir() 打印 DOM 元素,在属性列表的最后面,即可看到该元素的类型。

(11) 字面量类型

在这里插入图片描述

  1. str1 是一个变量(let),它的值可以是任意字符串,所以类型为:string。
  2. str2 是一个常量(const),它的值不能变化只能是 ‘Hello TS’,所以,它的类型为:‘Hello TS’。
    此处的 ‘Hello TS’,就是一个字面量类型。也就是说某个特定的字符串也可以作为 TS 中的类型。
    除字符串外,任意的 JS 字面量(比如,对象、数字等)都可以作为类型使用
    使用模式:字面量类型配合联合类型一起使用。
    使用场景:用来表示一组明确的可选值列表。
    比如,在贪吃蛇游戏中,游戏的方向的可选值只能是上、下、左、右中的任意一个。
    在这里插入图片描述

(12) 枚举

枚举的功能类似于字面量类型+联合类型组合的功能,也可以表示一组明确的可选值。
枚举:定义一组命名常量。它描述一个值,该值可以是这些命名常量中的一个。

  1. 使用 enum 关键字定义枚举。
  2. 约定枚举名称、枚举中的值以大写字母开头。
  3. 枚举中的多个值之间通过 ,(逗号)分隔。
  4. 定义好枚举后,直接使用枚举名称作为类型注解
    在这里插入图片描述
    注意:形参 direction 的类型为枚举 Direction,那么,实参的值就应该是枚举 Direction 成员的任意一个
访问枚举成员

在这里插入图片描述
类似于 JS 中的对象,直接通过点(.)语法访问枚举的成员。

数字枚举

把枚举成员作为函数的实参,它的值为0
在这里插入图片描述
注意:枚举成员是有值的,默认为:从 0 开始自增的数值。
当然,也可以给枚举中的成员初始化值
在这里插入图片描述

字符串枚举

枚举成员的值是字符串

在这里插入图片描述
注意:字符串枚举没有自增长行为,因此,字符串枚举的每个成员必须有初始值

特点与比较

枚举是 TS 为数不多的非 JavaScript 类型级扩展(不仅仅是类型)的特性之一。其他类型仅仅被当做类型,而枚举不仅用作类型,还提供值(枚举成员都是有值的)。其他的类型会在编译为 JS 代码时自动移除。但是,枚举类型会被编译为 JS 代码

枚举与前面讲到的字面量类型+联合类型组合的功能类似,都用来表示一组明确的可选值列表。
一般情况下,推荐使用字面量类型+联合类型组合的方式,因为相比枚举,这种方式更加直观、简洁、高效。
在这里插入图片描述

(13) any 类型

原则:不推荐使用 any!这会让 TypeScript 变为 “AnyScript”(失去 TS 类型保护的优势)。当值的类型为 any 时,可以对该值进行任意操作,并且不会有代码提示。

尽可能的避免使用 any 类型,除非临时使用 any 来“避免”书写很长、很复杂的类型!
其他隐式具有 any 类型的情况:

  1. 声明变量不提供类型也不提供默认值
  2. 函数参数不加类型。
    注意:因为不推荐使用 any,所以,这两种情况下都应该提供类型

(14)typeof

TS 也提供了 typeof 操作符,不光可以使用js的方式查询一个变量的类型,还可以在类型上下文中引用变量或属性的类型(类型查询)。

使用场景:根据已有变量的值,获取该值的类型,来简化类型书写
在这里插入图片描述
简化为:
在这里插入图片描述

  1. 使用typeof操作符来获取变量p 的类型,结果与第一种(对象字面量形式的类型)相同。
  2. typeof 出现在类型注解的位置(参数名称的冒号后面)所处的环境就在类型上下文(区别于JS 代码)。
  3. 注意:typeof 只能用来查询变量或属性的类型,无法查询其他形式的类型(比如,函数调用的类型)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑤ | 11.13 - 11.14

前言 第11章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.13 制定预算 11.13.1 主要输入 11.13.2 主要输出 11.14 规划质量管理 11.14.1 主要输入 11.14.2 主要工…

TensorRT推理时间不稳定的解决方案

目录 解决方案 第一步 第二步 效果 解除锁频方法 解决方案 锁定GPU时钟频率(实测有效) 第一步 使用 nvidia-smi -q -d SUPPORTED_CLOCKS 查询GPU支持的最高频率,如下图所示为 8001 MHz 第二步 cmd(管理员权限&#xff09…

【Python机器学习】朴素贝叶斯——使用朴素贝叶斯进行文档分类(理论基础)

机器学习的一个重要应用就是文档的自动分类。在文档分类中,整个文档(比如电子邮件)是实例,而电子邮件中的某些元素则构成特征。虽然电子邮件是一种会不断增加的文本,但我们同样也可以对新闻报道、用户流言、公文等其他…

recursion depth exceeded” error

有些时候不可以用jax.jit装饰器 参考资料:使用 JAX 后端在 Keras 3 中训练 GAN |由 Khawaja Abaid |中等 (medium.com)

JVM GC总结

CMS垃圾回收器 参考:垃圾回收之CMS、G1、ZGC对比:https://developer.baidu.com/article/details/2770126 CMS(Concurrent Mark Sweep)垃圾回收器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使…

Nginx中WebSocket配置说明

查看 laravel 的 swool扩展文档时遇到不懂的,问了文心一言 https://gitee.com/resourcesplus/laravel-s/#%E5%90%AF%E7%94%A8websocket%E6%9C%8D%E5%8A%A1%E5%99%A8 nginx语法中 upstream 和 proxy_pass 用法

51单片机15(直流电机实验)

一、序言:我们知道在单片机当中,直流电机的控制也是非常多的,所以有必要了解一些这个电机相关的一些知识,以及如何使用单片机来控制这个电机,那么在没有学习PWM之前,我们先简单的使用GPIO这个管脚来控制电机…

C#初级——枚举

枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且,在这个整型常量列表中,通常默认第一位枚举符号的值为0,此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…

学习日志:JVM垃圾回收

文章目录 前言一、堆空间的基本结构二、内存分配和回收原则对象优先在 Eden 区分配大对象直接进入老年代长期存活的对象将进入老年代主要进行 gc 的区域空间分配担保 三、死亡对象判断方法引用计数法可达性分析算法引用类型总结1.强引用(StrongReference…

AR 眼镜之-充电动画定制-实现方案

目录 📂 前言 AR 眼镜系统版本 充电动画 1. 🔱 技术方案 1.1 方案介绍 1.2 实现方案 关机充电动画 亮屏/锁屏充电动画 2. 💠 关机充电动画 2.1 关机充电动画核心处理类与路径 2.2 实现细节 步骤一:1)定制 …

uniapp map组件自定义markers标记点

需求是根据后端返回数据在地图上显示标记点&#xff0c;并且根据数据状态控制标记点颜色&#xff0c;标记点背景通过两张图片实现控制 <mapstyle"width: 100vw; height: 100vh;":markers"markers":longitude"locaInfo.longitude":latitude&…

2024年国际高校数学建模竞赛问题B:空间迁移计划和战略 成品文章分享

2024年国际高校数学建模竞赛问题B&#xff1a;空间迁移计划和战略&#xff08;2024 International Mathematics Molding Contest for Higher Education (IMMCHE)Problem B: Space Migration Program and Strategy&#xff09; 星际迁移计划中的资源分配与风险管理策略研究 摘…

开始尝试从0写一个项目--后端(三)

器材管理 和员工管理基本一致&#xff0c;就不赘述&#xff0c;展示代码为主 新增器材 表设计&#xff1a; 字段名 数据类型 说明 备注 id bigint 主键 自增 name varchar(32) 器材名字 img varchar(255) 图片 number BIGINT 器材数量 comment VARC…

Hive3:基本介绍

一、概述 Apache Hive是一款分布式SQL计算的工具&#xff0c; 其主要功能是&#xff1a; 将SQL语句翻译成MapReduce程序运行 Hive是单机工具&#xff0c;只需要部署在一台服务器即可。 Hive虽然是单机的&#xff0c;但是它可以提交分布式运行的MapReduce程序运行。 二、基本…

友盟U-APM——优秀的前端性能监控工具

在数字化转型浪潮的推动下,移动应用已成为企业连接用户、驱动业务增长的核心载体。然而,随着应用复杂度的日益提升,用户对于应用性能稳定性的期待也水涨船高。面对应用崩溃、卡顿、加载缓慢等频发问题,如何确保应用的流畅运行,成为产研团队亟待解决的关键挑战。在此背景下,友盟…

苦学Opencv的第九天:模板匹配

Python OpenCV入门到精通学习日记&#xff1a;模板匹配 前言 模板匹配是一种最原始、最基本的识别方法&#xff0c;可以在原始图像中寻找特定图像的位置。模板匹配经常应用于简单的图像查找场景中&#xff0c;例如&#xff0c;在集体合照中找到某个人的位置。 #mermaid-svg-N…

PYTHON学习笔记(八、字符串及的使用)

目录 1、字符串 1.1、字符串的常用操作 1.2、格式化字符串 1.2.1、占位符格式化字符串 1.2.2、f-string格式化字符串 1.2.3、str.format( )格式化字符串 1.3、数据的验证 1.4、正则表达式 1.5.1元字符 1.5.2限定符 1.5.3其他字符 1.5.4re模块 1、字符串 1.1、字符…

PySimpleGUI的安装、使用介绍

PySimpleGUI的安装等介绍 如果直接使用pip命令是无法下载免费版的&#xff0c;通过设置的python Interpreter也不可以下载到5.0.0之前的版本了。 现在已经无法通过pycharm直接获取到PySimpleGUI的免费&#xff08;无需登录&#xff09;版&#xff0c;不过听说可以登入官网然后进…

【JS逆向课件:第十八课:JS操作2】

4.12、BOM对象&#xff08;了解&#xff09; BOM:Broswer object model,即浏览器提供我们开发者在javascript用于操作浏览器的对象。 4.12.1、window对象 窗口方法 // BOM Browser object model 浏览器对象模型// js中最大的一个对象.整个浏览器窗口出现的所有东西都是win…

C++笔记---缺省参数和函数重载

1. 缺省参数 1.1 定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值&#xff08;默认值&#xff09;。在调用该函数时&#xff0c;如果没有指定实参 则采用该形参的缺省值&#xff0c;否则使用指定的实参&#xff0c;缺省参数分为全缺省和半缺省参数。 void Func(…