likes
comments
collection
share

摸鱼偷学TS:类型断言与类型守卫浅聊一下 又到了一周一度的周五了,和前面几天一样,依旧在摸鱼,耐不住寂寞,所以今天来学习

作者站长头像
站长
· 阅读数 23

浅聊一下

又到了一周一度的周五了,和前面几天一样,依旧在摸鱼,耐不住寂寞,所以今天来学习TS类型断言与类型守卫...

在金三银四的尾巴上了车,如果你也和我一样也想在大三找一份还不错的实习,欢迎掘友们私聊我交流面经(wechat: LongLBond

类型断言

来看以下代码:

const person = {}
person.name = 'juejue'
person.age = 20

如果在JavaScript中,很显然这段代码是没有问题的,首先创建了一个空的person对象,然后给person添加了两个属性

但是如果在TS中,会报一个person上不存在name、age属性的错误,那么如何在TS中已知存在name、age属性的情况下,避免这个错误呢?

interface Person {
  name: string,
  age?: number
}
const person = {} as Person
person.name = 'longjiang'
person.age = 20

定义了一个Person接口,通过as告诉编译器person就是Person这个接口类型的,这就是类型断言, 虽然但是,还是建议掘友们不要滥用类型断言,使用需谨慎!!!

双重断言

双重断言一听就知道得使用两次断言,肯定是一次断言不起作用

interface Person {
	name: string;
	age: number;
}

const person = 'xiaomuzhu' as Person; 

一看就知道string类型的属性还攀上Person了,不得了,但是没有成功

摸鱼偷学TS:类型断言与类型守卫浅聊一下 又到了一周一度的周五了,和前面几天一样,依旧在摸鱼,耐不住寂寞,所以今天来学习

那么如何让它成立,使用双重断言

interface Person {
	name: string;
	age: number;
}

const person = 'xiaomuzhu' as any as Person; // ok

先把它断言成any类型,再断言成Person类型,同样的,双重断言也建议掘友们谨慎使用~

类型守卫

类型守卫听起来十分的高大上,但是看我略举几个例子掘友们就会明白...

instanceof

instanceof 类型保护是通过构造函数来细化类型的一种方式

用instanceof来判断传入的参数是什么类型的,判断完毕以后,就可以使用arg上特有的属性,否则会造成以下报错

摸鱼偷学TS:类型断言与类型守卫浅聊一下 又到了一周一度的周五了,和前面几天一样,依旧在摸鱼,耐不住寂寞,所以今天来学习

in

跟上面的例子类似,x in y 表示 x 属性在 y 中存在

function getSome2(arg: Person | Animals) {
    if('age' in arg) {
        console.log(arg.age)
    }
    if('talk' in arg) {
        console.log(arg.talk)
    }
}

在函数 getSome2 中,arg 参数是一个联合类型,它可以是 Person 类型或 Animals 类型(假设这两个类型已经在其他地方定义)。函数内部使用了 in 操作符来检查 arg 对象是否具有特定的属性,并据此执行相应的操作。

字面量守卫

当你在联合类型中使用字面量类型时,它可以帮助检查它们是否有区别:

type Foo = {
    kind: 'foo';
    foo: number;
}
type Bar = {
    kind: 'bar';
    bar: number;
}

function doStuff(arg: Foo | Bar) {
    if(arg.kind === 'foo') {
        console.log(arg.foo)
    }
    if(arg.kind === 'bar') {
        console.log(arg.bar)
    }
}
  • 在函数体内,通过检查 arg.kind 属性的值来判断 arg 的实际类型。
  • 如果 arg.kind 等于 'foo',则 TypeScript 编译器可以推断出 arg 的类型必须是 Foo,因此可以安全地访问 arg.foo 属性并打印它。
  • 类似地,如果 arg.kind 等于 'bar',则编译器推断 arg 的类型是 Bar,因此可以访问 arg.bar 属性并打印它。

结尾

潦草地结束本章内容...

转载自:https://juejin.cn/post/7372396174248738854
评论
请登录