一、联合类型
联合类型可以认为一个变量可能有两种或两种以上的类型。举个例子,声明两个接口student(学生)接口和teacher(老师)接口,然后在写一个study的方法,里边传入一个res(任意值),这时候可以能是student,也可能是teacher。所以我们使用了联合类型,关键符号是|(竖线)。代码如下:
interface student {
study: boolean;
write: () => {};
}
interface teacher {
study: boolean;
teach: () => {};
}
function school(res: student | teacher) {
res.write();
}
如果直接写一个这样的方法,就会报错,因为school不能准确的判断联合类型具体的实例是什么。
这时候就需要再引出一个概念叫做类型保护,类型保护有很多种方法,如下:
1、类型保护--类型断言
类型断言就是通过断言的方式确定传递过来的准确值,简而言之就是判断,如下:
function school(res: student | teacher) {
if (res.study) {
(res as teacher).teach();
}else{
(res as student).write();
}
}
如果study为true,这时候就可以通过断言res as teacher,然后直接调用teach()方法,程序就不再报错了。同样study为false,这时候调用write()方法,就不会报错了。这就是通过断言的方式进行类型保护。也是最常见的一种类型保护形式。
2、类型保护--in语法
也可以使用in语法来作类型保护,代码如下:
function school(res: student | teacher) {
if ("teach" in res) {
res.teach();
} else {
res.write();
}
}
3、类型保护--typeof语法
以一个add方法,方法接收两个参数,这两个参数可以是数字number也可以是字符串string,为例:
function add(first: string | number, second: string | number) {
return first + second;
}
如果我们不做任何的类型保护,只是相加,这时候就会报错。
解决这个问题,就可以直接使用
typeof来进行解决。如下:
function add(first: string | number, second: string | number) {
if (typeof first === "string" && typeof second === "string") {
return `${first}${second}`;
}else{
return first + second;
}
}
4、类型保护--instanceof语法
如果做类型保护的是一个对象,这时候就可以使用instanceof语法,如下:
class num {
count: number;
}
function addO(first: object | num, second: object | num) {
return first.count + second.count;
}
这时候传递过来的参数,可以是任意的object,也可以是num的实例,然后我们返回相加值,没有进行类型保护,肯定是会报错的。
直接使用
instanceof语法进行判断一下,就可以解决问题。如下:
function addObj(first: object | num, second: object | num) {
if (first instanceof num && second instanceof num) {
return first.count + second.count;
}
}
注:instanceof 只能用在类上。
二、枚举类型(Enum)
在程序中能灵活的使用枚举(enum),会让程序有更好的可读性。以下面一段代码为例:
function student(status: number) {
if (status === 0) {
return "小明";
} else if (status === 1) {
return "小红";
} else if (status === 2) {
return "小刚";
}
}
const result = student(0);
console.log(`我是${result}`);
当程序代码过多时,很难确定对应数字所代表的人名,可读性较差,修改如下:
const Status = {
'xiaoming': 0,
'xiaohong': 1,
'xiaogang': 2,
};
function student(status: any) {
if (status === Status.xiaoming) {
return "小明";
} else if (status === Status.xiaohong) {
return "小红";
} else if (status === Status.xiaogang) {
return "小刚";
}
}
const result = student(Status.xiaoming);
console.log(`我是${result}`);
同样,使用枚举也可以实现上面的效果,代码如下:
enum Status {
xiaoming,
xiaohong,
xiaogang,
}
function student(status: any) {
if (status === Status.xiaoming) {
return "小明";
} else if (status === Status.xiaohong) {
return "小红";
} else if (status === Status.xiaogang) {
return "小刚";
}
}
const result = student(Status.xiaoming);
//const result = student(0);//0对应Status.xiaoming
console.log(`我是${result}`);
枚举类型是有对应的数字值的,默认是从 0 开始的。我们直接用console.log()就可以看出来了。
console.log(Status.xiaoming);
console.log(Status.xiaohong);
console.log(Status.xiaogang);
不想默认从 0 开始,而是想从 1 开始。可以这样写。如下:
enum Status {
xiaoming=1,
xiaohong,
xiaogang,
}
枚举还可通过下标进行反查,如下:
console.log(Status.xiaoming,Status[0]);
console.log(Status.xiaohong,Status[1]);
console.log(Status.xiaogang,Status[2]);
学习日期:2022/1/4
视频参考:www.bilibili.com/video/BV1qV…
仅供个人学习和记录