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