TypeScript
一. 安装
1 | npm install typescript --dev |
生成tsconfig.json
配置文件
1 | tsc --init |
常用配置项
target
: 编译之后的JavaScript版本;例如: es5、es2016
module
: 编译之后的模块化标准;例如: commonjs
rootDir
: 需要编译文件所在位置
strict
: 是否开启严格模式
lib
: 内置对象对应的声明所在的标准库列表; 例如: es2015; DOM(浏览器对象)
注意: 一旦生成配置文件,使用
tsc
命令不在可以编译一个文件; 比如:tsc index.ts
显示中文报错信息
1 | tsc --locale zh-CN |
二. 基本使用
1 | const a: string = '1234' |
在使用es2015新增的Symbol、Promise等新增对象的时候,如果你的配置文件中配置了
target:'es5'
,会编译不通过原因: 配置
target:'es5'
所引入的标准库中没有这些对象的类型声明解决办法:
配置
target:'es2015'
通过配置
lib
更改引用的标准库; 例如:lib: ['es2015','DOM']
;注意: 需要引入
DOM
标准库,其中包括了浏览器对象的类型声明,否则console
这些浏览器对象会编译不通过
1. 对象
1 | const a: object = {id:'001'} // function (){} [] |
TypeScript中object
类型并不只是包括对象,函数、数组等都是可以赋值给object
类型的
可以通过{}
字面量的形式来限制只能赋值为对象
也可以{id:string,name:string,age:number}
来限制对象的成员,这种限制是强制的,对象的成员不能多也不能少,必须是声明的这些成员
2. 数组
1 | //泛型 |
数组不可以通过[]
字面量的形式来限制
想通过字面量必须指定数组元素的类型,例如: [number,string]
,这样的被称为元组
,并且元组
和对象一样是强制的
3. 枚举
1 | enum Status { |
枚举在你没有设置值的时候,默认从0
开始递增; 例如: Status
如果你赋值一个数字,之后的枚举不赋值,那么之后的默认从赋值的值才是递增; 例如: Status
普通的枚举是在编译之后的js
文件中会产生一个双向键值对对象
双向键值对对象
: 通过key可以拿到value,通过value可以拿到key
例如:Status
编译成js之后
1 | var Status; |
通过const enum
创建静态枚举
静态枚举
在编译之后不会产生双向键值对对象
,而会使用值替换掉引用
比如: const fourStatus = Status.four
编译之后 var stopStatus = 6
TypeScript中大多数特性都不会产生多余的代码,而是删除定义的代码
4. 函数
1 | function fn1(name?:string,age:number = 10):string { |
在定义函数时,函数的限制是强制的,在调用时必须传入对应类型、数量的参数
你可以使用 默认值 或者 ?:
的方式规避这种情况
在使用 函数表达式 来定义函数时,可以使用(name:string,sex:string) => string
来规定函数的参数和返回值的类型
5. 任意类型(any)
1 | let any1:any = 123 |
任意类型可以接收任何类型的值,TypeScript不会对其进行类型检查,所以它是不安全的,应该减少使用
6.隐式类型推断
1 | let y = 123 |
隐式类型推断 : 不指定变量的类型,通过所赋的值来推断变量的类型
比如:let y = 123
y 就是 number
类型
当变量在定义时没有赋值,那么该变量会被设置为any
类型; 例如: 上面的y1
变量
7. 类型断言
1 | const nums = [101,102,103,'104'] |
类型断言: 当一个变量没有设置类型时,而开发者明确知道其会是什么类型,就可以类型断言
例子:
上面代码中res
没有声明类型,TypeScript推断为number | string
所以const pow = res * res
会编译报错
而作为开发者很确定res
只会得到number
类型的值,就可以使用类型断言
断言之后const pow1 = num1 * num1
就可以编译通过了
类型断言有两种方式:
- as
- <[type]>
注意: 类型断言并不是类型转换
8. 接口
1 | interface User{ |
接口一般用于定义对象成员的类型
?:
: 可选属性readonly
: 只读属性
当不知道对象具体有那些属性时,可以
1 | interface Post{ |
9. 类
1 | interface Eat{ |
在声明类的属性的时候必须 赋初始值 或者 在
constructor
赋值
属性修饰符
public
: 任何地方都可以访问该属性private
: 只有在该类中才能访问该属性protected
: 只有在该类或者集成该类的子类才能访问该属性static
: 静态属性readonly
: 只读属性
接口(interface)
接口可以设置属性的类型,某一个类在implements
实现一个接口的时候,必须实现接口中设置的属性
- 抽象类
某一个类如果继承了一个抽象类,那么该类必须实现抽象类中的抽象方法,并且使用该类构建的实例会用于抽象类的函数
10. 泛型
1 | function createArray<T>(length:number,value:T):T[]{ |
泛型: 指函数在定义时不知道具体类型,在函数调用的时候才确定具体的类型
11. 类型声明
1 | import { camelCase } from 'loadsh' |
当我们引入安装的模块,如果模块中没有定义类型,需要我们自己定义一个类型,否则类型检查不通过
参考文档:深入理解 TypeScript