ts泛型与泛型约束
函数泛型 需求 编写一个函数,传入两个参数,返回这两个参数组成的数组 注意,两个参数的类型必须一致 例如 fun(1,2) => [1, 2] fun("2", "2") =>
ts泛型与泛型约束
发布时间:2023-10-12 (2023-10-12)

函数泛型

需求

编写一个函数,传入两个参数,返回这两个参数组成的数组

注意,两个参数的类型必须一致

例如 
fun(1,2)       => [1, 2]
fun("2", "2")  => ["2", "2"]

不使用泛型

function numberArray(a1:number, a2:number):number[]{
    return [a1, a2]
}
function stringArray(a1:string, a2:string):string[]{
    return [a1, a2]
}

使用泛型

泛型就是把类型当做参数

function array<T>(a:T, b:T):T[]{
    return [a, b]
}


console.log(array(1,2))
console.log(array("1","5546"))
console.log(array(true, false))
console.log(array(null, null))
function array<T>(a:T, b:T):T[]{
    return [a, b]
}

console.log(array<number>(1,2))

多参数情况

function array<T,K>(a:T, b:K):(T|K)[]{
    return [a, b]
}

console.log(array(1,"2"))
console.log(array<number, string>(1,"2"))

泛型约束

比如,我希望我传入的这个参数,能够 .length

那么它的类型就应该是 string或者是数组

function array<T extends string|any[]>(a:T, b:T):T[]{
    console.log(a.length)
    return [a, b]
}

console.log(array("12334","2"))
console.log(array(["1", "33"],["2"]))


接口泛型

接口函数

interface Fun {
    (name: string):string
}

let fun:Fun = function (name:string):string{
    return ""
}

接口函数的泛型

interface ArrType<T> {
    (a1: T,a2:T):T[]
}

let fun:ArrType<string> = function (a1:string, a2:string):string[]{
    return [a1, a2]
}

属性泛型

interface Info<T> {
    like: T
}

let zhangsan: Info<string> = {
    like: "羽毛球"
}
let lisi: Info<string[]> = {
    like: ["羽毛球"]
}

泛型约束

interface Info<T extends string|string[]> {
    like: T
}

let zhangsan: Info<string> = {
    like: "羽毛球"
}
let lisi: Info<string[]> = {
    like: ["羽毛球"]
}

和接口继承在一起的时候,不要搞混了

interface People {
    name?: string
}
interface Info<T extends string|string[]> extends People{
    like: T
}

let zhangsan: Info<string> = {
    like: "羽毛球"
}
let lisi: Info<string[]> = {
    like: ["羽毛球"]
}

keyof

interface Info {
    name: string
    age: number
}

let zhangsan:Info = {
    name:"zhangsan",
    age: 21
}

function getInfoValue(info:Info, key: string):void{
    // 这个时候,这里会报错,原因是因为传入的这个key,有可能不是Info的属性
    console.log(info[key])
}

getInfoValue(zhangsan, "name")

使用keyof

interface Info {
    name: string
    age: number
}

let zhangsan:Info = {
    name:"zhangsan",
    age: 21
}

function getInfoValue(info:Info, key: keyof Info):void{
    console.log(info[key])
}

getInfoValue(zhangsan, "name")
getInfoValue(zhangsan, "age")
getInfoValue(zhangsan, "age1") // 不满足keyof的校验,会报错

getInfoValue函数的基础上,实现将value返回

interface Info {
    name: string
    age: number
}

let zhangsan:Info = {
    name:"zhangsan",
    age: 21
}

function getInfoValue<T extends keyof Info>(info:Info, key: T):Info[T]{
    return info[key]
}

getInfoValue(zhangsan, "name")
getInfoValue(zhangsan, "age")