TS中的感叹号和问号的用法

本文详细介绍了 TypeScript 中的 ! 和 ? 运算符的使用。! 用于变量赋值时强制类型转换,允许 null 或 undefined 赋值给其他类型,并在调用时确保值存在。? 则用于可选参数和防御性编程,它在访问对象属性时提供安全性,只有当对象非空时才会尝试访问属性。此外,? 仅适用于读操作,若要写操作需配合类型断言。
摘要由CSDN通过智能技术生成

!和?

!用法

  • 用在变量前表示取反

  • 用在赋值的内容后时,使null和undefined类型可以赋值给其他类型并通过编译,表示该变量值可空

let y:number

y = null		// 无法通过编译
y = undefined	// 无法通过编译

y = null!
y = undefined!
// 由于x是可选的,因此parma.x的类型为number | undefined,无法传递给number类型的y,因此需要用x!
interface IDemo {
    x?: number
}

let y:number

const demo = (parma: IDemo) => {
    y = parma.x!
    return y
}

?用法

  • 除了表示可选参数外,常用于防御性编程
const a = fetch(...) || {}		// 假设a是从后端拿到的一个对象类型数据
const unsafeData = a.b.c		// 这样写时不安全的,无法确保b是否有值,如果为空则b.c会进行报错
const safeData = a?.b?.c		// 实际上就是相当于 const safeData = a && a.b && a.b.c

当使用A对象属性A.B时,如果无法确定A是否为空,则需要用A?.B,表示当A有值的时候才去访问B属性,没有值的时候就不去访问,如果不使用?则会报错

// 由于函数参数可选,因此parma无法确定是否拥有,所以无法正常使用parma.x,使用parma?.x向编译器假设此时parma不为空且为IDemo类型,同时parma?.x无法保证非空,因此使用parma?.x!来保证了整体通过编译
interface IDemo {
    x: number
}

let y:number

const demo = (parma?: IDemo) => {
    y = parma?.x!
    console.log(parma?.x)	// 只是单纯调用属性时就无需!	
    return y
}
    
// 如果使用y = parma!.x!是会报错的,因为当parma为空时,是不拥有x属性的,会报找不到x的错误

但是?用法只能读操作而不能写操作,对一个可能为空的属性赋值是不会被编译通过的,此时还需用用到类型断言

interface IDemo {
    x: number
}

// 编译报错,不能赋值给可选属性
const demo = (parma?: IDemo) => {
    parma?.x = 1	
}
    
// 使用类型断言  
const demo_ = (parma?: IDemo) => {
    let _parma = parma as IDemo
    _parma.x = 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值