У меня сложилось впечатление, что я могу доверять 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)
.(Я также хочу выдать ошибку деления на ноль вместо того, чтобы возвращать бесконечность.)
Существуют ли другие функции, которые мне нужно переопределить или перенести?
Обратите внимание, что с TypeScript,Мне нужно заботиться только о математических операциях, которые могут вернуть NaN
.TypeScript предотвратит ошибки типа, такие как {} + 1
.