Skip to content

函数泛型

js
// 现在需求是p1与p2必须是同类型传参
function join(p1: string | number, p2: string | number) {
    return `${p1}${p2}`
}
join('str', 1) // 做不到控制p1 与 p2 同类型

// 1、泛型 generic:泛指的类型(不知道具体的类型, 调用时再指定)
function join<T> (p1: T, p2: T) { // 注意写法
    return `${p1}${p2}`
}
// 调用时指定
join<string>('a', 'b')
// join<string>('a', 1) // 报错,p2必须也是string
join<number>(1, 2)
// join<number>(1, 'a') // 报错,p2必须也是number

// 2、泛型也可以作为类型别名使用
function concat<T>(p1: T[], p2: T[]) { // T[] 等价于 Array<T>
    return p1.concat(p2)
}
concat<string>(['1'], ['2']) // 指定类型
concat([1], [2]) // 不指定类型则会进行类型推断
concat(['1'], [2]) // 这个会报错,因为p1和p2都是T类型的数组,前者传了string,后者传了number


// 3、泛型可以有多个
function join<T, P> (p1: T, p2: P) { // 注意写法
    return `${p1}${p2}`
}
join(1, '1') // 不报错,自动类型推断 T为number,P为string
join<number, number>(1, 1) // 指定T、P的类型