TypeScript学习笔记(上):TypeScript的介绍、安装及常用类型

我对TypeScript的理解就是,TypeScript是增加了类型校验的JavaScript,能够把运行期错误提升至编译期

TypeScript是什么?

TypeScript(简称:TS)是 JavaScript 的超集(JS 有的 TS 都有)。

TypeScript = Type + JavaScript(在 JS 基础之上,为 JS 添加了类型支持)。

TypeScript 是微软开发的开源编程语言,可以在任何运行 JavaScript 的地方运行。

说明:所有合法的 JS 代码都是 TS 代码,有 JS 基础只需要学习 TS 的类型即可。

安装编译 TS 的工具包

问题:为什么要安装编译 TS 的工具包?

回答:运行环境Node.js或浏览器,只认识 JS 代码,不认识 TS 代码。需要先将 TS 代码转化为 JS 代码,然后才能运行。

安装命令:npm i -g typescript。 typescript 包:用来编译 TS 代码的包,提供了 tsc 命令,实现了 TS -> JS 的转化。

验证是否安装成功:tsc -v(查看 typescript 的版本)

运行 TS 的步骤

运行方式:使用 ts-node 包,直接在 Node.js 中执行 TS 代码。

安装命令:npm i -g ts-node(ts-node 包提供了 ts-node 命令)。

使用方式:ts-node hello.ts。

解释:ts-node 命令在内部"偷偷的"将 TS -> JS,然后,再运行 JS 代码。

TypeScript 常用类型

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

JS 已有类型

原始类型:number、string、boolean、null、undefined、symbol

对象类型:object(包括,数组、对象、函数等对象)

TS 新增类型

联合类型、自定义类型(类型别名)、接口、元组、字面量类型、枚举、void、any 等

简单数据类型

完全按照 JS 中类型的名称来书写即可

数组类型

两种写法,推荐使用第一种

联合类型

由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种

用 | 把可能的类型分隔开(注意不是 || )

有括号和没有括号的区别

TypeScript 复制代码
let arr: (number | string)[]  //一个数组,数组元素可以是数值型或字符串型
let arr: number | string[]  //一个数字或一个字符串数组

类型别名

类型别名(自定义类型):为任意类型起别名

使用场景:当同一类型(复杂)被多次使用时,可以通过类型别名,简化该类型的使用

函数类型

法一

法二

法二只适用于函数表达式

没有返回值的函数

如果函数没有返回值,那么,函数返回值类型为:void

有可选参数的函数

可选参数:在函数中,某个或多个参数可以传也可以不传

在可传可不传的参数后面加上?

**注意:**可选参数只能出现在参数列表的最后

对象类型

解释:

  1. 直接使用 {} 来描述对象结构。属性采用 属性名: 类型 的形式;方法采用 方法名(): 返回值类型 的形式。

  2. 如果方法有参数,就在方法名后面的小括号中指定参数类型(比如:greet(name: string): void)。

  3. 在一行代码中指定对象的多个属性类型时,使用 ;(分号)来分隔。

  4. 如果一行代码只指定一个属性类型(通过换行来分隔多个属性类型),可以去掉 ;(分号)。

  5. 方法的类型也可以使用箭头函数形式(比如:{ sayHi: () => void })

接口

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

解释:

  1. 使用 interface 关键字来声明接口。

  2. 接口名称(比如,此处的 IPerson),可以是任意合法的变量名称。

  3. 声明接口后,直接使用接口名称作为变量的类型。

  4. 因为每一行只有一个属性类型,因此,属性类型后没有 ;(分号)

interface(接口)和 type(类型别名)的对比

相同点:都可以给对象指定类型。

不同点:接口,只能为对象指定类型。

类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名

通过继承实现接口中公共的属性or方法的复用

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

元组

元组类型和数组很像,元组类型是另一种类型的数组,它确切地知道包含多少个元素,以及特定索引对应的类型

使用 number[] 的缺点:不严谨,因为该类型的数组中可以出现任意多个数字。

更好的方式:元组(Tuple)

该示例中,元素有两个元素,每个元素的类型都是 number

类型推论

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

换句话说:由于类型推论的存在,这些地方,类型注解可以省略不写!

发生类型推论的 2 种常见场景:1、在声明变量的同时完成初始化时 2、决定函数返回值时。

推荐:能省略类型注解的地方就省略(偷懒,充分利用TS类型推论的能力,提升开发效率)。

技巧:如果不知道类型,可以通过鼠标放在变量名称上,利用 VSCode 的提示来查看类型。例如不知道js中某个内置函数的返回值类型, 直接将鼠标移到函数名上,就会自动显示函数返回值

字面量类型

通过 TS 类型推论机制,可以得到答案:

  1. 变量 str1 的类型为:string。

  2. 变量 str2 的类型为:'Hello TS'。

解释:

  1. str1 是一个变量(let),它的值可以是任意字符串,所以类型为:string。

  2. str2 是一个常量(const),它的值不能变化只能是 'Hello TS',所以,它的类型为:'Hello TS'

注意:此处的 'Hello TS',就是一个字面量类型。也就是说某个特定的字符串也可以作为 TS 中的类型。 除字符串外,任意的 JS 字面量(比如,对象、数字等)都可以作为类型使用

字面量类型配合联合类型一起使用:用来表示一组明确的可选值列表

比如,在贪吃蛇游戏中,游戏的方向的可选值只能是上、下、左、右中的任意一个

枚举

枚举的功能类似于字面量类型+联合类型组合的功能,也可以表示一组明确的可选值。

枚举:定义一组命名常量。它描述一个值,该值可以是这些命名常量中的一个

解释:

  1. 使用 enum 关键字定义枚举。

  2. 约定枚举名称、枚举中的值以大写字母开头。

  3. 枚举中的多个值之间通过 ,(逗号)分隔。

  4. 定义好枚举后,直接使用枚举名称作为类型注解

解释:通过将鼠标移入 Direction.Up,可以看到枚举成员 Up 的值为 0。

注意:枚举成员是有值的,默认为:从 0 开始自增的数值。

我们把,枚举成员的值为数字的枚举,称为:数字枚举。

当然,也可以给枚举中的成员初始化值

字符串枚举:枚举成员的值是字符串。

注意:字符串枚举没有自增长行为,因此,字符串枚举的每个成员必须有初始值

any类型

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

解释:以上操作都不会有任何类型错误提示,即使可能存在错误!

尽可能的避免使用 any 类型,除非临时使用 any 来"避免"书写很长、很复杂的类型!

其他隐式具有 any 类型的情况:1、声明变量不提供类型也不提供默认值 2、函数参数不加类型。

注意:因为不推荐使用 any,所以,这两种情况下都应该提供类型

相关推荐
程序员爱技术1 小时前
Vue 2 + JavaScript + vue-count-to 集成案例
前端·javascript·vue.js
并不会2 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
衣乌安、2 小时前
【CSS】居中样式
前端·css·css3
兔老大的胡萝卜2 小时前
ppk谈JavaScript,悟透JavaScript,精通CSS高级Web,JavaScript DOM编程艺术,高性能JavaScript pdf
前端·javascript
龙鸣丿2 小时前
Linux基础学习笔记
linux·笔记·学习
低代码布道师2 小时前
CSS的三个重点
前端·css
一点媛艺3 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风3 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
耶啵奶膘3 小时前
uniapp-是否删除
linux·前端·uni-app
奋斗的小花生4 小时前
c++ 多态性
开发语言·c++