TypeScrip 学习(一)环境配置和基本类型
前言
目前,JavaScript已经成为编写网页和应用程序的主要语言,前端也在一个产品中的权重越来越大,但是因为JavaScript设计之初的先天问题,导致JavaScript创建大型复杂Web应用系统很困难,也很难维护。
比如 JavaScript的数据类型是不确定的,可以进行隐式转换,导致很多错误在运行的时候才能发现,这就需要开发使用更多的精力去检查代码;
而TypeScript能解决这些问题,甚至他是JS的超集,JS有的我都有,JS没有的我也有,总之我是前端版西厂对东厂。
起步
安装
1  | npm install typescript -g  | 
以上为安装和查看安装的版本
我们创建一个ts文件,然后使用 tsc [文件名] 就可以执行生成一个解析的js文件
当我们需要配置ts我们可以执行tsc -init去创建 tsconfig.json 文件
例如我们取消严格模式的时候可以在该文件中修改strict:false
为了方便我们学习我们需要借用一些工具
全局安装 ts 的编译工具,使用 ts-node 可以将 ts 文件执行
npm i ts-node -g- 使用:
ts-node index.ts 
这时候我们就可以直接执行
ts-node [文件名]且获取返回值了- 使用:
 安装
ts-node依赖包:npm install tslib @types/node -g安装声明文件:
npm i @types/node --save-dev(node环境支持的依赖必装)
TS类型
- TS 出现弥补的 JS 的类型缺失
 - 众所周知,代码错误越早发现越好,代码编写 > 代码编译 > 代码运行 开发 > 测试 > 上线
 - Vue2 使用 Flow 进行类型检查,后续 Vue3 也使用 Typescript 重写
 - TS 代码要运行在浏览器,需要进行类型擦除,转换为 JS 代码
 - TS 类型包含所有 JS 类型 
null、undefined、string、number、boolean、bigInt (ES10)、Symbol(ES6)、object(数组,对象,函数,日期) - 还包含 
void、never、enum、unknown、any以及 自定义的type和interface 
字符串类型
1  | //字符串是使用string定义的  | 
数字类型
1  | let notANumber: number = NaN;//Nan  | 
布尔类型
1  | let booleand: boolean = true //可以直接使用布尔值  | 
空值类型
JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数
1  | function voidFn(): void {  | 
void也可以定义undefined 和 null类型,但是这需要取消严格模式
Null和undefined类型
1  | let u: undefined = undefined;//定义undefined  | 
void 和 undefined 和 null 最大的区别:undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 string 类型的变量:
1  | //非严格模式  | 
Any 类型 和 unknown (顶级类型|任意类型)
- 1.没有强制限定哪种类型,随时切换类型都可以 我们可以对 
any进行任何操作,不需要检查类型 - 2.声明变量的时候没有指定任意类型默认为
any - 3.弊端如果使用
any就失去了TS类型检测的作用 - 4.
TypeScript 3.0中引入的unknown类型也被认为是top type,但它更安全。与any一样,所有类型都可以分配给unknown. 
unknow:unknow类型比any更加严格当你要使用any的时候可以尝试使用unknow,因为unknow只能赋值自身或者any,且unknow不能读到自身任何属性
接口和对象类型
对于对象类型容易搞混的是object、Object 以及{},那么他们有什么区别呢。
ObjectObject类型是所有Object类的实例的类型。 由以下两个接口来定义:Object接口定义了Object.prototype原型对象上的属性;ObjectConstructor接口定义了Object类的属性, 如上面提到的Object.create()。这个类型是跟原型链有关的原型链顶层就是Object,所以值类型和引用类型最终都指向Object,他包含所有类型。
{}
看起来很别扭的一个东西 你可以把他理解成new Object 就和我们的上面Object基本一样 包含所有类型1
2
3let a1: {} = {name:'hale'} //正确
let a2: {} = () => 123//正确
let a3: {} = 123//正确object代表所有非值类型的类型,例如 数组 对象 函数等,常用于泛型约束
1
2
3let a1: object = {name:1} //正确
let a2: object = () => 123//正确
let a3: object = 123//不正确在TS中我们定义对象的方式要用关键字
interface(接口),我的理解是使用interface来定义一种约束,让数据的结构满足约束的格式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29interface A {
d:number
}
interface Person {
b:string,
a:string,
c?:number,//可选属性?,该属性可以不存在
[propName: string]: any;//任意属性定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集
}
//如果重名,interface合并
interface Person extends {
readonly id:string, //只读属性是不允许被赋值的只能读取
cb:()=>void
}
const person:Person = {
a:"hale",
b:'man',
d:25
cb:()=>{
console.log(123)
}
}
//定义一个函数类型
interface Fn{
(name:string):number[]
}
const fnHandle:Fn=function (name:string){
return [12,13]
}
数组类型
1  | // 类型数组  | 
元组 Tuple
元组就是数组的变种
元组(Tuple)是固定数量的不同类型的元素的组合
1  | //元组与集合的不同之处在于,元组中的元素类型可以是不同的,而且数量固定  | 
应用场景,前端导出excel文件的时候,后端返回数据
1  | let excel: [string, string, string, number][] = [  | 
函数类型
基本函数类型
1  | //注意,参数不能多传,也不能少传 必须按照约定的类型来  | 
扩展函数类型
1  | //函数this类型  | 








