《TypeScript实战指南》—2.2.4 typeof 与 instanceof
2.2.4 typeof 与 instanceof
现在我们可以使用类型保护来重构一开始的 padLeft 代码了。可以考虑用联合类型书写padLeft代码,可以像下面这样利用类型断言来写:
function isNumber(padding: number | string): padding is number {
return typeof padding === "number";
}
function isString(x: number | string): x is string {
return typeof padding === "string";
}
function padLeft(value: string, padding: number | string) {
if (isNumber(padding)) {
return Array(padding + 1).join(" ") + value;
}
if (isString(padding)) {
return padding + value;
}
throw new Error(`Expected string or number, got '${padding}'.`);
}
padLeft("Hello world", 4); // " Hello world"
但每次 typeof 进行类型判断都必须定义个函数,这是否又显得烦琐了呢?
TypeScript 并没那么愚蠢。幸运的是TypeScript 会将 typeof padding === "number" 为一种类型保护,那我们可以继续保持之前的代码结构了。
TypeScript 让我们自作聪明了一次。
typeof 在 TypeScript 中使用时,只能匹配基本类型时,才会启用类型保护。如果你使用的是 typeof padding === “hello TypeScript”,即便你向TypeScript 热情地打了一个招呼,它也不会将这识别为一个有效类型,为你热情地打开有效的类型保护。
除了 typeof 以外,instanceof 也可以起到类型保护的作用。Instanceof相较于 typeof,其类型保护更为精细,是通过构造函数来区分类型的一种方式。
比如,我们丰富一下之前 Teacher 和 Student 的例子,如下所示:
interface Person {
talk(): void
}
class Teacher implements Person {
constructor(name: string) { }
talk() {
}
}
class Student implements Person {
constructor(name: string, age: number, classRoom: string) { }
talk() {
}
}
function getPerson() {
return Math.random() < 0.5 ?
new Teacher("张老师") :
new Student("小明", 8, "三班");
}
const person= getPerson(); // Teacher | Student
if (person instanceof Teacher) {
person; // Teacher
}
if (person instanceof Student) {
person; // Student
}
这里的类型微微有一点超纲了,interface 关于接口的使用会在下一章提及。我们先略过这一点点内容,只关心 instanceof 的使用。
我们可以看出 instanceof 在类型的使用上,与 typeof 相比,可以将类作为比较对象,从而实现类型保护。
- 点赞
- 收藏
- 关注作者
评论(0)