变量后面加感叹号,加了个寂寞

非空断言,断不断言都会报错,加了有什么用?

在TypeScript中,非空断言操作符( ! )仅在编译阶段发挥作用,用于告知TypeScript编译器一个值绝对不会是 nullundefined 。这是一种类型断言方式,目的在于帮助开发者避开编译时的类型错误,尤其在严格模式下非常有用。

怎样工作?

当你使用非空断言操作符后,TypeScript会在编译过程中假定关联的变量或属性不为空,从而允许你访问它们的属性或方法而无需进行额外的null检查。因此,这个操作符不会影响到生成的JavaScript代码,也就是说它在运行时没有任何作用。

注意事项

因为非空断言只在编译阶段起作用,所以如果变量在运行时实际为 nullundefined ,使用非空断言后的代码仍然可以导致运行时错误如:“TypeError: Cannot read property ‘…’ of null”。因此,在使用非空断言时需要对相关逻辑非常确信,避免滥用,确保在运行时不会出现空值。

1赞

这是一个cocos star writer问出来的问题么

3赞

2楼的回复恰好验证了我的观点

开发用?不好吗,比如funcA?.(1)

我吐槽的是感叹号,注意审题 :face_with_monocle:

image
不加报错,加了不报错,这不还是有用的吗

这样编译出来的代码会变多,用!不会
funcA?.() 编译后是 funcA && funcA()

funcA!.() 编译后是 funcA()

好像是这样的,我没试,印象中 :grinning:

既然要.length,写| undefined本来就没什么意义
况且我这边写不写叹号都不报错的,是你插件报的吧

一个功能而已,你用的到就用,用不到就算了。 :grinning:

意义大也不大,就像ts与js,解释一下,有助于后续理解代码

不是插件 是开了strict模式, 肯定有意义的, 只是我举例子这样写,如果用的是别人写好的方法, 而且你不能保证自己传的对象不是undefined但是又想编译出来跑跑看呢? 比如这样
image

1赞

你obj没初始化就跑的意义是什么

不是老哥, 真的需要说那么具体吗, 真没遇到过需要它的场景?

image
我确保这个数据存在或者我管他存不存在,懒得写if,让他运行时在报错算了,这时候用断言不就有意义了

如果变量本身可能是 undefined,那他就应该加上 | undefined,这样编译器才能实时提醒你,变量可能为空,每次用到都要注意判空

我觉得非空断言的意义在于,告诉编译器,在特定场景下,我知道他一定是非空的,我不希望在运行时再做多一次没用的判断,所以才使用非空断言

但是往往很多时候非空断言会被滥用,用于偷懒减少类型检查的工作

我用过的语言里面,似乎逻辑都是这样的~
如果他可能为空,那么应该用?
如果你申明的时候可能为空,但使用的确定不为空,那么可以用!
为什么用了!,为空的时候会报错,因为你告诉编译器这里不为空了~
你出尔反尔~

因为?的作用,本来就是帮你减少书写代码量的,不代表编译后还能给你减少~

如果变量本身可能是 undefined,那他就应该加上 | undefined 这个我不认同,完全没有意义
而且大部分变量非法判断都是没必要的,只要运行后会报错那就是安全的,多余的非法判断反而掩盖了错误数据产生的点,给排查增加难度

增加排查难度,那是程序的问题
但是线上跑的项目出现不符合预期的报错,那就是产品质量的问题

见仁见智,我更注重后者

所以我说大部分情况,而不是100%。
如果能做到代码100%可控,而且测试充分,就根本不存在不符合预期的报错。