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

时间:2017-02-27 23:37:01

标签: typescript

我有一个非常简单的情况,让我感到困惑。我将参数传递给快速的http get函数。它在查询中使用,所以我确保它是一个数字(因此我可以安全地从SQL注入)。

由于我的客户端数据结构,我将这些数字转换为字符串。所以我不小心传了一个字符串而不是一个数字。它导致我的应用程序通过,因为invoiceId被评估为未定义,并且查询失败。

为了防止这种情况,我添加了一个空检查。这是一个有效的例子(有一些混乱,所以没有编译错误将字符串转换为数字):

(注意,发现值是作为字符串值"未定义"传递的,因此混淆。我仍然有无法捕获它的问题因为打字稿禁止我检查是否invoiceId是一个字符串值,因为它应该是一个数字。我假设is强制类型!)

class IBadInput { value: any };

var badInput = { value: "undefined" } as IBadInput;
var invoiceId = badInput.value as number;

if (typeof invoiceId == 'undefined' || invoiceId == null)
{
  console.log("inoice id not provided");
}

console.log("getting for invoice", invoiceId);

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

getting for invoice undefined

我们已经尝试检查invoiceId == undefinedtypeof invoiceId == null仅检查if(invoiceId)以检查它是否真的"真实的"但是一切都通过了这项检查。

知道为什么,以及如何抓住它?

1 个答案:

答案 0 :(得分:1)

  

我仍然遇到无法捕捉它的问题,因为打字稿禁止我检查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.
  

知道为什么......

转换为数字仅在编译时发生,并且在运行时没有影响。如果客户端应用程序在运行时输入一个字符串,那么该变量将是运行时的字符串,既不是typeof undefined也不是null

您可以通过running the above in TypeScript play了解更多信息。