typescript的学习记录
ts的准备工作
什么是ts
TypeScript是JavaScript的超集,因为它扩展了JavaScript,有JavaScript没有的东西。
硬要以父子类关系来说的话,TypeScript是JavaScript子类,继承的基础上去扩展。为什么要用ts
简单来说就是因为JavaScript是弱类型, 很多错误只有在运行时才会被发现
而TypeScript提供了一套静态检测机制, 可以帮助我们在编译时就发现错误ts的特点
支持最新的JavaScript新特特性
支持代码静态检查
支持诸如C,C++,Java,Go等后端语言中的特性 (枚举、泛型、类型转换、命名空间、声明文件、类、接口等)
安装
1 | npm i -g typescript |
编译生产js
1 | tsc index.ts |
不编译直接运行
安装一个工具 npm i -g ts-node
1 | ts-node index.ts |
ts的语法
声明变量并给它指定类型
1 | let a: number = 3 |
类型的别名
用type定义一个类型的别名
1 | type mytype = 1 | 2 | 3 |
函数的类型声明
声明参数的类型及返回值的类型
1 | // 函数的类型声明 |
ts的类型
string number boolean undefined null
bigint
symbol object (8种内置类型)
9 array(数组)10 tuple
(元组 固定长度 固定类型的数组)11 enum
(枚举)12 any
13 unknown
14 void
15 never
16 literal
(字面量类型)17 union types联合类型
8 object
{}用来指定对象可以包含哪些属性
1 | let b:{name: string, age?:number} // ?表示属性是可选的 |
9 array数组
两种方式
1 | let e: string[] |
10 tuple元组
1 | let h: [string, number] |
11 enum枚举
1 | // 定义一个枚举Gender |
12 any
表示任意类型,一个变量设置类型为any后相当于对该变量关闭了ts的类型检测,不建议使用any
声明变量如果不指定类型,则ts解析器会自动判断变量的类型为any
13 unknown
表示未知的类型
any和unknown的区别:
any类型的变量可以赋值给其他类型的变量,相当于嚯嚯了别的变量。unknown类型的变量不能直接赋值给其他类型的变量,会报错。
14 void
用来表示空,以函数为例,表示没有返回值的函数
1 | function fn():void{ |
15 never
表示永远不会返回结果
1 | function fn2():never{ |
16 literal字面量
限制变量的值就是该字面量的值
1 | let a: '男' | '女' |
17 union types联合类型
1 | let myFavoriteNum: string | number |
类型断言
可以告诉解析器变量的实际类型。以下为两种写法:
1 | <string>abc |
ts的编译选项
-w
tsc index.ts -w 自动监听当index.ts变化时自动编译
tsconfig.json
ts编译器的配置文件,ts编译器可以根据它的信息来对代码进行编译
有了这个文件,只需执行tsc -w可以同时自动编译根目录下的所有ts文件
1 | { |
面向对象
抽象类 abstract
1 | // 关键字abstract定义抽象类,抽象不能实现,只能被继承 |
继承 extends super
1 | class Dog extends Animal{ |
接口 interface implement
用来定义一个类结构,用来定义一个类中应该包含哪些熟悉和方法,不能有实际值,方法都是抽象方法。
接口和抽象类的区别是抽象类中可以有非抽象的方法,而接口中都是抽象方法。
同时接口也可以当成类型声明去使用
1 | interface myinterface{ |
属性的封装 private
public 属性默认是公共的
private 私有属性 用getter setter,只能在当前类访问
protected 受保护的,只能在当前类和子类中访问
1 | class Person{ |
定义类的简写
1 | class Person{ |
泛型
在定义函数或者类时,如果遇到类型不明确就可以使用泛型
不预先指定具体的类型,而是在使用时再指定类型
1 | function fn<T>(a: T):T{ |