是否有可能使TypeScript在0/0和Math.log(-1)崩溃而不返回NaN?

时间:2018-11-27 10:13:45

标签: javascript typescript types nan typechecking

给我的印象是,我可以信任Flow或TypeScript来保护我免受NaN错误的侵害,但这不是事实。

这是一个演示问题的PoC存储库:https://github.com/ndbroadbent/typescript-experiments

const testFunction = (a: number, b: number) => {
  if (a > b) {
    return;
  } else if (a < b) {
    return;
  } else if (a === b) {
    return;
  } else {
    throw new Error("Unreachable code");
  }
}

使用以下函数可以正常工作:

testFunction(1, 2);

但是以下调用会引发错误:

testFunction(1, 0 / 0);

testFunction(1, Math.log(-1));

testFunction(1, Math.sqrt(-2));

testFunction(1, parseFloat('string'));

您可能会说这是“正确”的行为,但是我宁愿编写不需要处理任何NaN值的代码。我想在JavaScript尝试调用0 / 0Math.log(-1)时出现运行时错误,以便我的错误报告易于理解,并且可以解决实际问题。当NaN在您的代码中传播并在某个随机位置崩溃时,可能很难找到源。

只要结果为Math.log,覆盖Math.sqrtNaN便很容易崩溃。而且我可能会写一个Babel插件,将a / b转换成assertNotNaN(a / b)甚至是safeDivide(a, b)之类的东西。 (我也想抛出除零错误而不是返回Infinity。)

我还有其他需要重写或转换的功能吗?

请注意,使用TypeScript,我只需要关心可以返回NaN的数学运算。 TypeScript可以防止诸如{} + 1之类的类型错误。

0 个答案:

没有答案