Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';使用非空断言有什么意义?_Javascript_Typescript - Fatal编程技术网

Javascript 什么';使用非空断言有什么意义?

Javascript 什么';使用非空断言有什么意义?,javascript,typescript,Javascript,Typescript,我是打字新手,我的课本上说: 只有当您知道不能出现空值时,才应使用非空断言。如果应用断言并且出现空值,将导致运行时错误。 因此,我编写了一个简单的typescript文件来验证(使用“strictNullChecks”:true): 以下是我的问题: Q1-我们可以看到CalculateAX(0,false)将返回null,在我运行程序后,根本没有运行时错误?为什么作者说会有运行时错误 Q2-I可以在不使用非空断言的情况下重写语句,如下所示: let taxValue: string | num

我是打字新手,我的课本上说:

只有当您知道不能出现空值时,才应使用非空断言。如果应用断言并且出现空值,将导致运行时错误。

因此,我编写了一个简单的typescript文件来验证(使用“strictNullChecks”:true):

以下是我的问题:

Q1-我们可以看到
CalculateAX(0,false)
将返回null,在我运行程序后,根本没有运行时错误?为什么作者说会有运行时错误

Q2-I可以在不使用非空断言的情况下重写语句,如下所示:

let taxValue: string | number = calculateTax(0, false);

它没有编译错误和运行时错误,工作正常,那么使用非空断言有什么意义呢?

如果使用
--stricnullchecks
运行编译,则会出现编译错误

error TS2531: Object is possibly 'null'.
应该提高。我猜作者是想说,如果继续使用假定为非null的对象,非null断言会导致运行时异常

例如,在上面的示例中,使用非null断言调用
taxValue
上的函数不会警告您该值可能为null,但如果该值为null,并且您在运行时调用该函数,则会引发异常


非null断言可用于删除falsy警告,即类型可能为null的KNOW非null变量可以像不可为null一样使用。

我猜您误解了类型断言的作用。这不是编译器所保证的,这是一种“弃权”,你给编译器说“我在此放弃检查这个类型的权利,我保证它在运行时是X,如果不是,我对后果负责”

通过使用
断言您基本上是在告诉编译器“闭嘴,我更清楚,这永远不会是空的”。编译器别无选择,只能同意您的意见,但如果您不遵守承诺(您不遵守),运行时故障即将发生


显然,类型断言几乎从来都不是一个好主意。最后,Typescript的全部要点是静态检查类型。在放入
之前请三思
在此处或那里作为

如果使用
null
执行某些操作,则会出现运行时错误。TS编译为JS,因此自然可以有
null
s,并且仅仅存在一个不会引起问题。但是
calculateTax(0,false)。toString()
会导致类型错误。至于Q2-你可以,但它仍然可以返回
null
,因此不仅仅是
string
number
@VLAZ,我知道
calculateTax(0,false)。toString()
会导致类型错误。所以我们只需要使用typeof来说明,这正是我的问题,如果您仍然需要手动检查,那么使用非空断言有什么意义呢?非空断言用于当您作为程序员知道您不会得到
null
但TS无法解决它时。例如,您执行
CalculateAX(userInput,false)
,这可能会导致
userInput=0
null
,但您实际上是在该值到达该代码点之前过滤该值。TS无法理解这一点(例如,它不知道您的验证逻辑),但它知道结果可能是
null
。但是,您知道永远不会有
userInput=0
,所以您可以告诉TS。
error TS2531: Object is possibly 'null'.