Я исчерпал свое Google-фу, пытаясь найти примеры того, как наилучшим образом утверждать параметры в методах модуля ES6 или иметь дело с неопределенностью типа данных, которые могут быть переданы.А именно между такими вещами, как строки и числовые типы.Я только несколько часов ломал голову над странным поведением вокруг вычисляемого свойства и MobX, где у меня есть некоторый тестовый код, который инициализирует отправленную по умолчанию отправленную величину, и это прекрасно работает.Вычисленное значение принимает начальное значение, суммирует две суммы из связанных данных (кредиты и дебеты), затем добавляет дебеты и вычитает кредиты, чтобы вернуть скорректированное значение.Таким образом, возвращаемое initialValue (1000) + totalDebits (0) - totalCredits (0), которое возвращает 1000. Простой.Однако, когда я добавил диалог для ввода нового элемента в список с начальным значением 2000, мое вычисленное значение возвращалось как 20000!Что было более странным, так это то, что я сохраняю эти объекты в локальном хранилище, и когда я обновляю сохраненные значения, вычисленная сумма все еще имела 20000, но другие существующие значения имели правильные вычисленные значения, соответствующие их начальным значениям.
Я наконецдействительно отследил причину этого и подтвердил в постоянном состоянии, что мой initialBalance с введенной страницы хранился как «2000», строковый литерал.«2000» + 0 - 0, который добавил 0 к строке, в то время как минус был проигнорирован.
Мой вопрос: какие есть варианты с простым JS или подходящей библиотекой ES6 для обработки типов, которые могут попадать вфункция, такая как действие MobX?Плюс любой совет для лучших практик при работе с аргументами JS в целом.
Например: в моем компоненте у меня есть событие onChange
onInitialBalanceChange(e){
const value = e.target.value;
const account = this.state.account;
let validationError = null;
let isBalanceValid = true;
if(!this.validateInitialBalance(value)){
validationError = 'The initial balance must be a positive number.'
isBalanceValid = false;
}
account.updateInitialBalance(value);
this.setState({validationError: validationError, isBalanceValid: isBalanceValid, isComplete: isBalanceValid && this.state.isNameValid});
}
updateInitialBalance зарегистрирован как действие MobX:
updateInitialBalance(initialBalance){
if (!!initialBalance) this.initialBalance = initialBalance;
return this;
}
Вот где мой вопрос / беспокойство, и мое удивление в том, что я действительно мало что видел в рассмотрении типов аргументов JS и преобразовании типов, помимо объяснений функций, которые выполняют отдельные проверки.Мой компонент выполняет проверочную проверку баланса и может вернуть баланс в виде числа, но при этом метод обновления все еще может вызываться в другом месте с числовой строкой.У меня есть утверждение, что аргумент не является пустым / пустым, но каковы наилучшие практики для утверждения / преобразования его типа, кроме значительного числа условий if ()?initialBalance может быть строкой «2000» или числом 2000, и он также должен защищать от недопустимых данных, таких как «fred» ??Поэтому я поставил вопрос о надежной проверке типов в мире с утками.
Судя по тому, что я вижу, это работает, но на основании документации это выглядит немного "неправильно":
if (!!initialBalance) this.initialBalance = parseInt(initialBalance);
parseInt принимает "строку", однако, если initialBalance уже является числом (не числовой строкой), это также работает.
Я знаю, что это немного надуманный вопрос, но я действительно ищу варианты, потому что крик в моих ушах от разработчика C # во мне становится оглушительным.:)