TS(TypeScript)
1.为什么要学习TS
01_TSvsJS
| TS | JS |
|---|---|
| JavaScript的超集,用于解决大型项目的代码复杂性 | 一种脚本语言,用于创建动态网页 |
| 强类型,支持静态和动态类型 | 动态弱类型语言 |
| 可以在编译期间发现并纠正错误 | 只能在运行时发现错误 |
| 不允许改变变量的数据类型 | 变量可以被赋予成不同类型 |
不仅仅是一种语言,而且是开发生产力的工具
TypeScript Playground: Ts到Js的在线编译 www.typescriptlang.org/
Awesome Typescript:TS开源教程及应用 github.com/dzharii/awe…
2.TS的基础
02_1.基础类型
1、boolean、number(包括正数、浮点数、负数等等)、string
2、枚举enum(TS特有)
enum Fruit{
apple,//0
organge,//1
banana,//2
}
//数值枚举,自动递增
enum Fruit2{
apple2 =1,//1
orange2,//2
banana2 =100,//100
watermelon2,//101
}
var Fruit;
(function (Fruit) {
Fruit[Fruit["apple"] = 0] = "apple";
Fruit[Fruit["organge"] = 1] = "organge";
Fruit[Fruit["banana"] = 2] = "banana";
})(Fruit || (Fruit = {}));
var Fruit2;
(function (Fruit2) {
Fruit2[Fruit2["apple2"] = 1] = "apple2";
Fruit2[Fruit2["orange2"] = 2] = "orange2";
Fruit2[Fruit2["banana2"] = 100] = "banana2";
Fruit2[Fruit2["watermelon2"] = 101] = "watermelon2";
})(Fruit2 || (Fruit2 = {}));
3、any、unknown、void
any:可赋值与反向赋值
unknown:any的替代,仅允许被赋值,不能直接赋值给其他变量
4、never
永远不存在值的类型(防御性编程使用)
function test(x:string|number):boolean{
if (typeof x==='string'){
return true;
}else if(typeof x==='number'){
return false;
}
return throwError('参数格式不对')
}
function throwError(message:string):never{
throw new Error(message)
}
5、数组类型[]
6、元组类型tuple(特殊数组)
显示标注数组中每个元素的类型
02_2、TS函数类型
定义:TS定义函数类型时要定义输入参数类型和输出类型
输入参数:参数支持可选参数和默认参数
输出参数:输出可以自动化推断、没有返回值时,默认是void类型
函数重载:名称相同但是参数不同、可以通过重载支持多种类型
function add(x:number[]):number
function add(x:string[]):string
function add(x:any[]):any{
if(typeof x[0] ==='string'){
return x.join()
}
if(typeof x[0] ==='number'){
return x.reduce((acc.cur)=> acc+cur)
}
}
02_3、interface
定义:接口是为了定义对象类型
特点:
- 可选属性:?
- 只读属性:readonly
- 可以描述函数类型
- 可以描述自定义属性
总结:接口非常灵活 duck typing
interface Person{
name:string
age:number
}
const p1:Person = {
name:'10';
age:18
}
p1.
interface RandomKey{
[propName:string]:string
}
const obj:RanmdomKey = {
a:'hello'
b:'world'
c:'typescript'
}
02_4、类
定义:写法和JS差不多、增加了一些定义
特点:
-
增加了public、private、protected
-
抽象类
- 只能被继承、不能被实例化
- 作为基类、抽象方法必须被子类实现
-
interface约束类、使用implements关键字
3.TS进阶
03_1、高级类型
1.联合类型 |
let num:number |string
num = 8
num ='eight'
2.交叉类型&
interface Person{
name:string
age:name
}
type Stduent =Person & {grade:number}
const stu:Student
stu.
3.断言类型
推荐用as
function getlength(arg: number| string):number{
const str=arg as.string
if(str.length){
return str.length
}else{
const number =arg as number
return number.tostring().length
}
}
4.类型别名(type VS interface)
-
定义:给类型起个别名
-
相同点
- 都可以定义对象或函数
- 都允许继承
-
差异点
- interface是TS用来定义对象,type是用来定义别名的
- type可以定义基本类型、interface不行
- interface可以重复声明、type不可以
组合和交叉类型用type,接口和implement用interface
03_2、泛型
应用场景
//定义一个print函数,这个函数的功能是把传入的参数打印出来。再返回这个参数。
function print(arg:string):string{
console.log(arg)
return arg
}//传入类型是string=,返回类型也是string
function print(arg:string | number):string | number{
console.log(arg)
return arg
}//传入类型是number和string。传入也是
function print(arg:any):any{
console.log(arg)
return arg
}//传入和打印任意类型
function print<T>(arg:T)T{
console.log(arg)
return arg
}//泛型
基本定义
-
泛型的语法是<>里面写类型参数,一般用T表示
-
使用时有两种指定类型:
- 定义要使用的类型
- 通过TS类型推断,自动推导类型
-
泛型的作用是临时占位,之后通过传来的类型进行推导
基础操作符
- typeof获取类型
interface Person{
name:string
age:number
}
const sem: Person = {name:"xxx".age:30}
type Sem =Person
type Sem =typeof sem://type Sem = Person
- keyof获取所有键
interface Person{
name:string;
age:number;
}
type K1=keyof Person;//"name"|"age"
type K2=keyof Person[];//"length"|"toString"|"pop"|"push"|"concat"|"join"
- in遍历枚举类型
type Keys ="a"|"b"|"c"
type Obj = {
[p in Keys]:any
}//->{a:any,b:any.c:any}
- T[K]索引访问
interface IPerson{
name;string;
age:number;
}
let type1: IPerson ['name']//string
let type2: IPerson ['age']//number
- extends:泛型约束
interface Lengthwise{
length:number
}
function loggingIdentity<T extends Lengthwise>(arg:T): T {
return arg;
}
loggingIdentity({value:3})
loggingIdentity({length:5})
常用工具类型
- Partial
<T>:将类型属性变为可选
type Partial<T> = {
[P in keyof T]?: T[P]
};
- Required
<T>:将类型属性变为必选
type Required <T>= {
[P in keyof T]-?:T[P]
};
- Readonly
<T>:将类型属性变为只读
type Reanonly <T> = {
reanonly [P in keyof T]:T[P]
};
- Pick、Record
4.TS实战
04_1、声明文件
- declare:三方库需要类型声明文件
- .d.ts:声明文件定义
- @type:三方库TS类型包
- tsconfig.json:定义TS的配置
04_2、泛型约束后端接口类型