我有一个非常简单的情况,让我感到困惑。我将参数传递给快速的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 == undefined
和typeof invoiceId == null
仅检查if(invoiceId)
以检查它是否真的"真实的"但是一切都通过了这项检查。
知道为什么,以及如何抓住它?
答案 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了解更多信息。