记录下TS中的特殊字符(?, !),以便于记忆查找,查看原文
1 2 3 4 5 6 7 | let y:number y = null // 无法通过编译 y = undefined // 无法通过编译 y = null! //通过编译 y = undefined! //通过编译 |
1 2 3 4 5 6 7 8 9 10 11 | // 由于x是可选的,因此parma.x的类型为number | undefined,无法传递给number类型的y,因此需要用x! interface IDemo { x?: number // 参数为可选项 } let y:number // 参数为number类型 const demo = (parma: IDemo) => { y = parma.x! // 变量值可空 return y } |
如果存在空情况的判断并赋具体值时,可以不用!,但是如果要想令y存在等于undefined的情况还是需要用!
1 2 3 4 5 6 7 8 9 10 | interface IDemo { x?: number } let y:number const demo = (parma: IDemo) => { y = parma.x || 1 // 如果为undefined,返回y=1,如果不为undefined,则返回parma.x的值 return y } |
1 2 | console.log(null || "xx" //xx console.log(undefined || "xx") //xx |
当使用A对象属性A.B时,如果无法确定A是否为空,则需要用A?.B,表示当A有值的时候才去访问B属性,没有值的时候就不去访问,如果不使用?则会报错
1 2 3 4 | var a = null; console.log(a) // null console.log(a.b) // 报错 console.log(a?.b) // undefined |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 由于函数参数可选,因此parma无法确定是否拥有,所以无法正常使用parma.x,使用parma?.x向编译器假设此时parma不为空且为IDemo类型,同时parma?.x无法保证非空,因此使用parma?.x!来保证了整体通过编译 interface IDemo { x:number // 参数为number类型 } let y:number // 参数为number类型 const demo = (parma?:IDemo) => { // parma?:IDemo 参数为可选项 y = parma?.x! // 变量值可空 console.log(parma?.x) // 只是单纯调用属性时就无需! return y // 可编译 } // 如果使用y = parma!.x!是会报错的,因为当parma为空时,是不拥有x属性的,会报找不到x的错误 |
但是?用法只能读操作而不能写操作,对一个可能为空的属性赋值是不会被编译通过的,此时还需用用到类型断言
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | interface IDemo { x:number // 参数为number类型 } // 编译报错,不能赋值给可选属性 const demo = (parma?: IDemo) => { // parma?:IDemo 参数为可选项 parma?.x = 1 // 变量值可空 } // 使用类型断言 const demo_ = (parma?: IDemo) => { let _parma = parma as IDemo _parma.x = 1 } |
下一篇:记录Chrome下使用CSS3动画效果导致页面出现闪烁Bug【已修复】
支付宝扫一扫打赏
微信扫一扫打赏
共 0 条评论关于"TypeScript中的特殊字符(?, !)的基本用法规则"
最新评论