Typescript 未定义的数字(从字符串转换)通过空检查

Typescript 未定义的数字(从字符串转换)通过空检查,typescript,Typescript,我有一个相当简单的情况,让我感到困惑。我正在向一个expresshttpget函数传递一个参数。它在查询中使用,所以我要确保它是一个数字(因此我不需要SQL注入) 由于客户端数据结构的原因,我将这些数字转换为字符串。所以我不小心传递了一个字符串而不是一个数字。它导致我的应用程序通过,因为invoiceId计算为undefined,查询失败 为了防止出现这种情况,我添加了一个空检查。下面是一个工作示例(有一些混乱,因此将字符串转换为数字不会出现编译错误): (注意,发现该值是作为字符串值“unde

我有一个相当简单的情况,让我感到困惑。我正在向一个expresshttpget函数传递一个参数。它在查询中使用,所以我要确保它是一个数字(因此我不需要SQL注入)

由于客户端数据结构的原因,我将这些数字转换为字符串。所以我不小心传递了一个字符串而不是一个数字。它导致我的应用程序通过,因为invoiceId计算为undefined,查询失败

为了防止出现这种情况,我添加了一个空检查。下面是一个工作示例(有一些混乱,因此将字符串转换为数字不会出现编译错误):

(注意,发现该值是作为字符串值“undefined”传递的,因此产生了混淆。我仍然存在无法捕获它的问题,因为typescript禁止我检查invoiceId是否是字符串值,因为它应该是一个数字。我假设
是强制类型!)

但是,在提供字符串invoiceId的情况下,它不会触发invoiceId==null语句。这是输出:

getting for invoice undefined
我已经尝试检查了
invoiceId==undefined
,以及
typeof invoiceId==null
just
if(invoiceId)
,以检查它是否“真实”,但所有内容都通过了此检查

知道为什么吗?我怎么才能抓住它

我仍然存在无法捕获它的问题,因为typescript禁止我检查invoiceId是否是字符串值,因为它应该是数字

一种方法是检查该值是属于
number
类型还是具有
null

let input: any = "Some string";
let invoiceId = input as number;

if (typeof invoiceId !== 'number' || invoiceId === null)
{ 
    document.write(invoiceId.toString() + ' is of type ' + (typeof invoiceId));
    document.write(" and needs to be a non-null value of type number.")
}
输出:

Some string is of type string and needs to be of type number.
知道为什么吗

转换为数字只在编译时发生,在运行时没有影响。如果客户端应用程序在运行时输入一个字符串,那么该变量在运行时将是一个字符串,它既不是未定义的
类型,也不是
null


您可以通过以下方式了解更多信息

那么
typeof invoiceId==“undefined”
呢?我很难相信您所断言的事实可能正在发生。这真的是你的代码吗?
=
运算符被明确定义为将
未定义的
空的
视为相等。您所声称的是,您的JavaScript运行时在语言的一个非常基本的部分中有一个严重的错误,这似乎很可疑。另外请注意,如果字符串的值实际上是字符串
“undefined”
,则您的
控制台.log()
输出看起来完全一样。Typescript实际上阻止我检查invoiceId==“未定义”,因为invoiceId应该是一个数字!
Some string is of type string and needs to be of type number.