TypeScript 函数泛型

function join(first: string | number, second: string | number) {
  return `${first}${second}`;
}
join('1', 1);

/**
* 这么看 join 还挺好用的。
* 如果我想做到这两个数要么都传 string,要么都传 number
* 一个 string,一个 number 时希望提醒我
*
* 这个时候需要使用泛型这个概念
* 泛型 generic 泛指的类型
* join<ABC>,这个 <abc> 指的就是泛型
*/

function join1<ABC>(first: ABC, second: ABC) {
  return `${first}${second}`;
}
join1<string>('1', '1');
// 这个意思就是调用 join1 时我指定 ABC 是 string,那么 first,second 都是 string
join1<number>(1, 1);
// 这个意思就是调用 join1 时我指定 ABC 是 number,那么 first,second 都是 number


/**
* 这个就是泛型的概念,有的时候遇到这样的情况
* ABC 后面加 [] ,变成 ABC[],那么就是一个数组
* 这个时候直接传字符串是不行的,要传 string 类型的数组
*/
function map<ABC>(params: ABC[]) {
  return params;
}
map<string>(['123']);
// 或者
function map1<ABC>(params: Array<ABC>) {
  return params;
}
map1<string>(['123']);


/**
* 泛型还可以指定多个
*/
function join2<T, P>(first: T, second: P) {
  return `${first}${second}`
}
join2<string, number>('1', 2)

/**
* 如果调用的时候不写类型, ts 会去推断
* 泛型只有在用的时候才知道是什么类型
*/