TS学习笔记
### 1. 类型系统
#### 数字类型声明:
let e:number;
#### 字符串类型声明:
let e:string;
#### 布尔类型声明:
let e:boolean=true;
//也可以声明完直接进行赋值,如果变量的声明和赋值是同时进行的,ts 可以自动对变量进行类型检测
等同于 let e=true;
JS 中的函数参数,不考虑类型和个数
function sum(a,b){
return a+b
}
TS 定义参数的类型:
function sum(a:number,b:number){
return a+b
}
sum(1,'b') // 此处提示报错:b 不是数字类型
定义返回值的类型:
function sum(a:number,b:number):number{
return a+'aaa' // 此处提示报错: 返回值的类型错误
}
#### 字面量类型声明:
let e:10;
e=11 // 此处会进行报错,e 已经被定义为 10,无法再赋值成别的值,有点类似于常量
#### 联合类型,| 用来连接多个类型
let e: "male" | "female";
e="male";
e="female";
e="hello"; // 此处会进行报错,hello 不是 male 或 femle
let e: boolean | string;
e=true;
e="aa";
e=10; // 报错,10 为数值类型
#### 任意类型:any,可以任意赋值,一个变量设置成 any 后相当于对该变量关闭了类型检测,不建议使用 any
let e:any;
e = 10;
e = "aaa";
e = true;
关于赋值:
let s; // s 的类型为 any
s=1234;
let e:string;
e=s; // e 的类型也被改变
#### unknown 类型
let s:unknow;
s=1235;
let e:string;
e=s; // 报错
#### 类型断言:
不允许不同类型的值进行赋值
let e:unknown;
let s:string;
e='hello'
if(type of e==="string"){
s=e;
}
已上写法等同于:
s = e as string
或者
s= <string>e
#### void:相对于函数返回值而言
function fn():number{
return 124
} // 此时返回值类型为:number
function fn():boolean{
return true
} // 此时返回值类型为:boolean
function fn(){} // 此时返回值类型为:void
function fn(num){
if(num>0){
return 1234
}else{
return false
}
} // 此时返回值类型为 any: 1234||false, number||boolean
function fn():void{
return 123; // 报错
return true; // 报错
不允许存在返回值
return // 可以
return undefined // 可以
return null // 可以
}
#### never:相对于函数返回值而言
function fn():never{ // 永远没有值
return undefined // 报错,不允许返回
throw new Error("程序报错,终止运行") // 用来提示程序报错,永远不会返回结果
}
#### object 对象
let a:object;
a={}
a=function(){}
可以直接写成
// {}用来指定对象里包含哪些属性
let a:{}
let a:{name:string}
a={} // 报错,没有 name 属性
应该写成
a={name:'Tom'}
a={name:'Tom',age:18} // 报错,age 没有存在于对象里
let b:{name:string,age:number}
b={name:'Tom'} // 不传 age 报错
可以写成
let b:{name:string,age?:number} // ?表示 age 可选
b={name:'Tom'} // 不传 age 可以
let c={name:string}
c={name:'Tom',age:12,gender:'female'} // 报错
可以写成
let c={name:string,[propName:string]:any} // [propName:string]:any 表示:任意字符串类型的属性
c={name:'Tom',age:12,gender:'female'} // name 必写,其他随意
<!-- 定义函数 -->
设置函数结构的类型声明
语法: (形参:类型,形参:类型,...)=>返回值
// 声明
let d:(a:number,b:number)=>number
// 赋值
d=fucntion (n1,n2):number{
return n1+n2
} // 符合声明
d=fucntion (n1,n2,n3):number{
return n1+n2
} // 报错,n3 未进行声明
#### 数组类型声明:
语法: ① 变量:类型[]
② 变量:Array<类型>
##### 字符串数组
let e:string[]; // string[]:
let e:Array<string>;
let a:string;
a=['a','b',1,2,4] // 报错,1,2,4 不是字符串类型
##### 数值数组
let e:number[];
let e:Array<number>;
##### 任意类型数组
let e:any[];
let e:Array<any>;
##### tuple 元组:固定长度以及类型的数组 tuple
let h:[string,string]
h=['aaa','bbb','ccc'] // 报错,规定了两个,不允许写三个
##### enum 枚举
ennum Gender={
male=1,
Female=2
}
let a:{name:string,gender:Gender}
a={
name:'Tom',
gender:Gender.male
}
console.log(a.gender===Gender.male)
let b:string|number; // b 的类型是 string 或者 number
let b:string&number // 报错, 不满足既是字符串又是数字的情况
let b:{name:string}&{age:number};
b={name:'Tom',age:18} // 可以
##### type 类型的别名
let c:1|2|3|4;
let d:1|2|3|4;
可以写成
type myType=1|2|3|4
let c:myType
let d:myType
c=7 // 报错,myType里没有7