摸鱼偷学TS:类型断言与类型守卫浅聊一下 又到了一周一度的周五了,和前面几天一样,依旧在摸鱼,耐不住寂寞,所以今天来学习
浅聊一下
又到了一周一度的周五了,和前面几天一样,依旧在摸鱼,耐不住寂寞,所以今天来学习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了,不得了,但是没有成功
那么如何让它成立,使用双重断言
interface Person {
name: string;
age: number;
}
const person = 'xiaomuzhu' as any as Person; // ok
先把它断言成any类型,再断言成Person类型,同样的,双重断言也建议掘友们谨慎使用~
类型守卫
类型守卫听起来十分的高大上,但是看我略举几个例子掘友们就会明白...
instanceof
instanceof
类型保护是通过构造函数来细化类型的一种方式
用instanceof来判断传入的参数是什么类型的,判断完毕以后,就可以使用arg上特有的属性,否则会造成以下报错
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