1. 类型推论
在TS中存在类型推断机制,在没有给变量添加类型注解的情况下,TS也会给变量推论出一个类型
let age = 18; //vscode自动推断出类型为number
2. 断言
有些时候开发者比Ts本身更清楚但钱的类型是什么,可以用断言(as)让类型更加精确和具体
type Person= {
name:string
age:number
}
//提前知道消息体数据格式,用断言
let userInfo = {} as Person;
3. 泛型
在定义接口/函数等类型的时候 ,不预先指定具体的类型,而在使用的时候在指定类型的一种特性,使用泛型可以复用类型并且让类型更加灵活
3.1 泛型接口
在接口类型的名称后面使用即可声明一个泛型参数,接口里的其他成员都能使用该参数的类型
interface ResData<T> {
code:number,
msg:string,
data:T
}
(1)//定义具体类型
interface User{
name:string
age:number
}
//使用泛型并传入具体参数
let UserData:ResData<User>{
code:200,
msg:'success',
data:{
name:'jack',
age:18
}
}
(2)//定义具体类型
interface Produnct{
id:number
goodName:string
}
//使用泛型并传入具体参数
let ProdunctData:ResData<Produnct>{
code:200,
msg:'success',
data:{
id:1,
goodName:'哇哈哈'
}
}
3.2 泛型别名
在接口类型别名后面使用即可声明一个泛型参数,接口里的其他成员都能使用该参数的类型
一般用于定义对象
type ResData<T> = {
code:number,
msg:string,
data:T
}
//定义具体类型
type User={
name:string
age:number
}
//使用泛型并传入具体参数
let UserData:ResData<User> ={
code:200,
msg:'success',
data:{
name:'jack',
age:18
}
}
3.3 泛型函数
在接函数名称后面使用即可声明一个泛型参数,整个函数中(参数、返回值、函数体)的变量都可以使用该参数的类型
function fn<T>() {}
let createArry = <T>(length:number , value:T)=>{
let arr = [];
for(let i =0; i<length; i++){
arr[i] = value
}
return arr
}
createArray(10,20) //泛型推论
createArray<number>(10,20)
createArray<string>(10,'hello')
3.4 泛型约束
作用:泛型的特点就是灵活不确定,有些时候泛型函数的内部需要访问一些特定类型的数据才有的属性,此时会有类型错误,需要通过泛型约束解决
interface LengthObj {
length:number
}
function logLen<T extends LengthObj>(obj:T){
console.log(obj.length)
}
logLen<string>('tom')
logLen<number>(200) //错误
logLen({
length:100,
name:"zhangsan"
})
logLen<{length:number,name:string}>({
length:100,
name:"zhangsan"
})