类型保护
大约 1 分钟TypescriptTypescript
提示
- 自定义类型保护
- typeof 类型保护
- instanceof 类型保护
一、前言
二、几种方式
1. 自定义类型保护
具体用例:
const valueList = [123, 'abc'];
const getRandomValue = () => {
const value = Math.random() * 10; // 这里取一个[0, 10)范围内的随机值
if (value < 5) { return valueList[0]; } else { return valueList[1]; } // 否则返回"abc"
};
function isString(value: number | string): value is string {
return typeof value === 'string';
}
const item = getRandomValue();
if (isString(item)) {
console.log(item.length); // 此时item是string类型
} else {
console.log(item.toFixed()); // 此时item是number类型
}
2. typeof 类型保护
如果是基本数据类型,而不是复杂的类型,可以直接使用typeof来做类型保护:
具体用例:
if (typeof item === "string") {
console.log(item.length);
} else {
console.log(item.toFixed());
}
需要注意点:
在TS中,对typeof的处理还有些特殊要求:
- 只能使用
=
和!
两种形式来比较 - type 只能是
number
、string
、boolean
和symbol
4种类型 - 在js种
typeof xxx
的结果还有object
、function
和undefined
。这些类型不具有保护的效果
3. instanceof 类型保护
具体用例:
class CreateByClass1 {
public age = 18;
constructor() {}
}
class CreateByClass2 {
public name = "lison";
constructor() {}
}
function getRandomItem() {
return Math.random() < 0.5 ? new CreateByClass1() : new CreateByClass2(); // 如果随机数小于0.5就返回CreateByClass1的实例,否则返回CreateByClass2的实例
}
const item = getRandomItem();
if (item instanceof CreateByClass1) { // 这里判断item是否是CreateByClass1的实例
console.log(item.age);
} else {
console.log(item.name);
}