- 编写一个联合类型 Demo
function join(first: string | number, second: string | number) {
return `${first}${second}`;
}
join("baidu", ".com");
join 方法接受两个参数 first
、second
,参数有可能是字符串类型,也有可能是数字类型。方法里为了保证都可以使用,所以我们只作了字符串的基本拼接。
但是现在如果想改成 :first参数如果传的是字符串类型,要求second也传字符串类型.同理,如果是number类型,就都是number类型。需要用到- 泛型
- 初始泛型概念-generic
泛型:[generic - 通用、泛指的意思],那最简单的理解,泛型就是泛指的类型。
泛型的定义使用<>(尖角号)进行定义的,比如现在给join方法一个泛型,名字就叫做ABC(起这个名字的意思,就是你可以随便起一个名字,但工作中要进行语义化。),后边的
参数.
function join<ABC>(first: JSPang, second: JSPang) {
return `${first}${second}`;
}
join < string > ("baidu", ".com")
//如果是number
join < number > (1, 2);
- 泛型中数组的使用
//第一种写法
function myFun<ANY>(params: ANY[]) {
return params;
}
myFun < string > ["123", "456"];
//第二种写法
function myFun<ANY>(params: Array<ANY>) {
return params;
}
myFun < string > ["123", "456"];
使用<T>来作泛型的表示
- 多个泛型的定义(一般第一个泛型用T,第二个用P代表)
function join<T, P>(first: T, second: P) {
return `${first}${second}`;
}
join < number, string > (1, "2");
- 泛型的类型推断
泛型也是支持类型推断的,比如下面的代码并没有报错,这就是类型推断。
function join<T, P>(first: T, second: P) {
return `${first}${second}`;
}
join(1, "2");
- 一个基本的类
class SelectGirl {
constructor(private girls: string[]) {}
getGirl(index: number): string {
return this.girls[index];
}
}
const selectGirl = new SelectGirl(["aa", "bb", "cc"]);
console.log(selectGirl.getGirl(1)); // bb
- 初始类的泛型
class SelectGirl<T> {
constructor(private girls: T[]) {}
getGirl(index: number): T {
return this.girls[index];
}
}
const selectGirl = new SelectGirl() < string > ["aa", "bb", "cc"];
console.log(selectGirl.getGirl(1));
-泛型中的继承
interface Girl {
name: string;
}
class SelectGirl<T extends Girl> {
constructor(private girls: T[]) {}
getGirl(index: number): string {
return this.girls[index].name;
}
}
const selectGirl = new SelectGirl([
{ name: "aa" },
{ name: "bb" },
{ name: "cc" },
]);
console.log(selectGirl.getGirl(1));