非空断言,断不断言都会报错,加了有什么用?
在TypeScript中,非空断言操作符( ! )仅在编译阶段发挥作用,用于告知TypeScript编译器一个值绝对不会是 null 或 undefined 。这是一种类型断言方式,目的在于帮助开发者避开编译时的类型错误,尤其在严格模式下非常有用。
怎样工作?
当你使用非空断言操作符后,TypeScript会在编译过程中假定关联的变量或属性不为空,从而允许你访问它们的属性或方法而无需进行额外的null检查。因此,这个操作符不会影响到生成的JavaScript代码,也就是说它在运行时没有任何作用。
注意事项
因为非空断言只在编译阶段起作用,所以如果变量在运行时实际为 null 或 undefined ,使用非空断言后的代码仍然可以导致运行时错误如:“TypeError: Cannot read property ‘…’ of null”。因此,在使用非空断言时需要对相关逻辑非常确信,避免滥用,确保在运行时不会出现空值。
这是一个cocos star writer问出来的问题么
2楼的回复恰好验证了我的观点
开发用?不好吗,比如funcA?.(1)
我吐槽的是感叹号,注意审题 

不加报错,加了不报错,这不还是有用的吗
这样编译出来的代码会变多,用!不会
funcA?.() 编译后是 funcA && funcA()
而
funcA!.() 编译后是 funcA()
好像是这样的,我没试,印象中 
既然要.length,写| undefined本来就没什么意义
况且我这边写不写叹号都不报错的,是你插件报的吧
一个功能而已,你用的到就用,用不到就算了。 
意义大也不大,就像ts与js,解释一下,有助于后续理解代码
不是插件 是开了strict模式, 肯定有意义的, 只是我举例子这样写,如果用的是别人写好的方法, 而且你不能保证自己传的对象不是undefined但是又想编译出来跑跑看呢? 比如这样

你obj没初始化就跑的意义是什么
不是老哥, 真的需要说那么具体吗, 真没遇到过需要它的场景?

我确保这个数据存在或者我管他存不存在,懒得写if,让他运行时在报错算了,这时候用断言不就有意义了
如果变量本身可能是 undefined,那他就应该加上 | undefined,这样编译器才能实时提醒你,变量可能为空,每次用到都要注意判空
我觉得非空断言的意义在于,告诉编译器,在特定场景下,我知道他一定是非空的,我不希望在运行时再做多一次没用的判断,所以才使用非空断言
但是往往很多时候非空断言会被滥用,用于偷懒减少类型检查的工作
我用过的语言里面,似乎逻辑都是这样的~
如果他可能为空,那么应该用?
如果你申明的时候可能为空,但使用的确定不为空,那么可以用!
为什么用了!,为空的时候会报错,因为你告诉编译器这里不为空了~
你出尔反尔~
因为?的作用,本来就是帮你减少书写代码量的,不代表编译后还能给你减少~
如果变量本身可能是 undefined,那他就应该加上 | undefined 这个我不认同,完全没有意义
而且大部分变量非法判断都是没必要的,只要运行后会报错那就是安全的,多余的非法判断反而掩盖了错误数据产生的点,给排查增加难度
增加排查难度,那是程序的问题
但是线上跑的项目出现不符合预期的报错,那就是产品质量的问题
见仁见智,我更注重后者
所以我说大部分情况,而不是100%。
如果能做到代码100%可控,而且测试充分,就根本不存在不符合预期的报错。