给我的印象是,我可以信任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 / 0
或Math.log(-1)
时出现运行时错误,以便我的错误报告易于理解,并且可以解决实际问题。当NaN
在您的代码中传播并在某个随机位置崩溃时,可能很难找到源。
只要结果为Math.log
,覆盖Math.sqrt
和NaN
便很容易崩溃。而且我可能会写一个Babel插件,将a / b
转换成assertNotNaN(a / b)
甚至是safeDivide(a, b)
之类的东西。 (我也想抛出除零错误而不是返回Infinity。)
我还有其他需要重写或转换的功能吗?
请注意,使用TypeScript,我只需要关心可以返回NaN
的数学运算。 TypeScript可以防止诸如{} + 1
之类的类型错误。