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
以及{}
,那么他们有什么区别呢。
Object
Object
类型是所有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类型 |