《TypeScript实战指南》—2.2.4 typeof 与 instanceof

举报
华章计算机 发表于 2019/06/16 12:38:20 2019/06/16
【摘要】 本节书摘来自华章计算机《TypeScript实战指南》一书中的第2章,第2.2.4节,作者是胡桓铭。

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 相比,可以将类作为比较对象,从而实现类型保护。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。