TypeScript 介绍及使用说明
Typescript
它不是一门语言,是js的超集,它包含了目前的es5标准,也包含了未来的es6\7\8的标准
还提供了很多后端的功能,比如静态类型检查,接口,泛型等。
主要给js带来了强类型定义的实际功能,相当于在原生js上加了一层类型定义
它不能直接运行在浏览器,需要通过tsc编译成js
ts的编译器叫tsc,就像es6的编译器叫babel
扩展
- es3\es5目前支持所有浏览器
- es6=es2015,es7=es2016,es8=2017,目前浏览器不支持,需要转换
Typescript作用好处
可以提供静态类型检查,对IDE有友好提示,规范代码编写,在代码编译阶段就能及时发现错误
比如:最常见的加法运算,当我们传入字符串类型代码也能正常运行,只是结果变成了字符串拼接而不是加法运算,这就是js的缺点,如果有了Ts的存在,就会检查类型,如果不是数字类型就会报错
配置TS运行环境
通过npm安装 命令:npm install -g typescript
ts官方文档中强调,要使用let const 去声明变量,避免使用var关键字
理论基础
- TS变量:数字 字符串 数组 元组
- 联合枚举(enum)any unknown void never
- 类型适配(类型断言) 函数类型
- 泛型 class interface module
实际演示
基本数据类型
function add (num1: number, num2: number) =>{}
let isTrue:boolean = true
let name:string = ""
数组
他们表示数组类型,并且数组里的元素都是数字
let list1:number[] = [1,2,3,4]
这种是泛型的写法
let list2:Array<number> = [1,2,3,4]
let list3:any[] = [1,'3', [1]]
元祖 tuple
元祖是,固定长度,固定类型,固定位置,的特殊数组
let list1:[number,string] = [1,'2']
联合类型 <|竖线写法>
只能保存定义好的数据类型,也就是或则算法二选其一
let union:string | number = '3'
function merge (n1:string|number,n2:number)=>{}
字面量类型 literval
表示literval的值只能是数字类型中的1,2,3
let literval:1|2|3 = 3
枚举类型 Enum
默认取值返回下标值,也可以设置默认值
enum Color {red blue green}
let c1 = Color.blue ===> 1
enum Color2 {red=2, green=3, blue=5}
enum Color3 {red='red', green='green', blue=3}
any 任意类型
它的值可以是任意类型
let renderValue:any = 7;
renderValue = true
renderValue = {}
unkonwn
比any更保险 需要手动判断
let randomValue:unkonwn = 6
void
表示函数没有任何返回的时候就是一个void类型
function printResult():void =>{}
funtion printResule():undefined =>{}
never 阻止函数执行完成
function throwErorr(msg:string,code:number):never=>{}
类型适配(类型断言)
代码执行到这里,IDE提示仍然是any类型TS并没有联想转换,如何能正确的转换成字符串
let message:any
message = 'abc';
message.endsWith('c');
第一种适配方法
let dd = (<string>message).endsWidth('c');
第二种适配方法
let dd = (message as string).endsWith('c')
函数类型
不论是可选参数还是默认值都要放到参数的末尾,加到第一个参数会报错
let log = (msg:string) =>{}
code参数是可选的
let log1 = (msg:string,code?:number) =>{}
code的默认值为200
let log2 = (msg:string,code:number=200) =>{}
对象
const person: {name:string,age:number}={name:'xx',age:12}
上面的写法略显复杂,可以简写让Ts自己去匹配
const person:object={}
any和object有什么区别,object更为精确,object类型是any类型的子集
interface 接口
通过Point接口给传入的参数做了限制
interface Point {x:number,y:number}
let drawPoint = (point: Point) => {}
interface最好是结合class类一起用,能够满足高内聚低耦合的需求
interface Node {x:number,y:number,node()=> void}
class Nodes implements Node {
y?:number,x?:number
constructor(x:number,y:number){this.x = x;this.y = y}
}
其实可以用这些属性省略上面的一些写法 public(公有) private(私有) protected
class Nodes implements Node {
constructor(public x:number,public y:number){}
}
module
引入文件时 结尾不需要叫后缀
import {point} from './ponit'
泛型
let list:Array<string> = ['1','2','3']
两个写法都可以
let last = <T>(arr:T[]) =>{}
let last = <T>(arr:array<T>) =>{}
调用上面的last方法也可以申明输出输入的类型
const ll = last<string|number>(['a','b'])
下面的x,y值可以是任意数据类型
let makeTuple = (x,y) => [x,y]
给他们安排不同的泛型
let makeTuple = <T,Y>(x:X,y:Y) => [x,y]
调用上面的方法也可以申明输出输入的类型
let v2 = makeTuple<boolean,number>(true,1)
泛型也可以设置默认类型
let makeTuple = <T,Y=number>(x:X,y:Y) => [x,y]
再次调用函数是可以省略第二个参数
let v2 = makeTuple<boolean>(true,1)
实际应用
用ts去编写一个弹框组件,通过函数的方式向外提供接口,具体的功能还是需要class类去实现
首先用interface接口规范配置参数,参数为可选
class类通过constructor来接受options形参,如何变成对象的属性?,在参数上加private,就可以通过this关键字获取,《也可以是public等》
如何添加默认属性?通过浅拷贝的形式,也可以用es6的展开运算符(…)来解决,如果浅拷贝的对象下还有对象,就不能用浅拷贝了
创建组件的interface接口,做一个组件的规范,做一个约束=
通过implements去约束类对象
引用temp模版,否则会提示未使用