console.log('点个关注再走吧🍺');|

Tod4

园龄:2年11个月粉丝:21关注:0

TS(四)泛型

TS(四)泛型与泛型约束

1 基本使用

  • TS的泛型可以让函数能够动态地支持多种参数和返回值的数据类型

  • 即在写的时候不指定具体的数据类型,而在调用的时候进行指定

  • TS的泛型在调用的时候可以不用指定类型,解释器会自己推断,下面的两个语句作用是相同的

    fun2<string, string>("1", "2")
    fun2("1", "2")
function fun(a:number, b:number):Array<number> {
return [a, b]
}
function fun1(a:string, b:string):Array<string> {
return [a, b]
}
function fun2<T>(a:T, b:T):Array<T> {
return [a, b]
}
console.log(fun2("1", "2"))

2 type类型别名、interface接口对泛型的支持

  • type类型别名可以使用泛型加联合类型的方式,让类型能够更加灵活地兼容各种数据类型
type A<T> = number | string | T
let a:A<boolean> = true
  • interface对泛型的支持
interface Data<T> {
msg:T
}
let data:Data<string> = {
msg: ""
}

3 多泛型的写法

  • ts的泛型可以指定多种同时进行使用
  • 并且可以在数组中使用泛型的联合类型
function fun3<T, K>(a:T, b:K):Array<T | K> {
return [a, b]
}
console.log(fun3(1, 2))

4 简单实现一个axios

const axios = {
get<T>(url:string):Promise<T> {
return new Promise((resolve, reject) => {
let xhr:XMLHttpRequest = new XMLHttpRequest()
xhr.open('GET', url)
// 状态监听
xhr.onreadystatechange = () => {
if(xhr.readyState == 4 && xhr.status == 200) {
resolve(JSON.parse(xhr.responseText))
}
}
xhr.send(null)
})
}
}
interface Data {
message:string,
code:number
}
axios.get<Data>('./data.json').then(res => {
console.log(res.message)
console.log(res.code)
})

5 泛型约束 keyof

  • 泛型约束 keyof用于约束泛型或者指定类型的属性

  • 如下是用来约束指定泛型的属性,这样在调用的时候一方面会自动提示属性,另一方面进行强制限制

    let obj = {
    name: "123",
    sex: 1
    }
    type Key = keyof typeof obj
    function get<T, K extends keyof T>(obj:T, key: K) {
    return obj[key]
    }
    console.log(get(obj, "name"))
  • keyof还可以用于类型别名进行约束:

    interface Data {
    name: string
    age: number
    sex: string
    }
    type Options<T extends object> = {
    readonly [Key in keyof T]?:T[Key]
    }
    type B = Options<Data>

    类型别名B就被定义成这样的了:

    image-20231002113357318
posted @   Tod4  阅读(81)  评论(0编辑  收藏  举报
   
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起