Как заставить тип атрибута объекта в javascript и реагировать

У меня странная проблема с тем, как javascript выполняет (или в моем случае не выполняет) динамическое типирование.

У меня есть следующий фрагмент кода, который будет считывать входные данные из поля, передавать его другой функции, которая назначит его в качестве атрибута kyselyoikeus .

  <input type="text" id={"kyselykiintioForLupatyyppi_" + this.props.lupatyyppi.lupatyyppi + "_input"}
    value={this.state.kyselykiintio}
    disabled={!kyselyoikeus.kaytossa}
    onChange={(event) => this.handleChangeQueryLimit(event.target.value)}
    className={this.state.invalidKyselykiintio ? "invalidPassivointiTime" : null} />

  handleChangeQueryLimit(kyselykiintio) { 
    this.setState({
      kyselykiintio: kyselykiintio,
      invalidKyselykiintio: !isKyselykiintioValid(kyselykiintio)
    }, () => this.props.changeQueryLimit(this.props.kyselyoikeus, kyselykiintio))
  }

Входное значение должно быть целым числом, но во входную строку можно ввести произвольную строку, которая будет присвоена свойству целевого объекта. Только на этапе проверки перед разноской проверяется, что свойство является допустимым номером со следующим фрагментом кода

export const isKyselykiintioValid = (kyselykiintio) => {
    // Is a whole number, 0 or more
    return Number(kyselykiintio) === kyselykiintio && kyselykiintio % 1 === 0 && kyselykiintio >= 0
}

Теперь проблема в том, что даже пользователь вводит целое число, оно назначается объекту в виде строки (значение ставится в кавычки, когда я регистрирую объект в консоли), и поэтому isKyselykiintioValid возвращает 0. Насколько я знаю, динамическое преобразование типов должно произойти в этот момент. Почему этого не происходит? Как я гарантирую, что атрибут установлен как целое число, если это целое число?

1 ответ

  1. Проблема заключалась в операторе сравнения. ===проверяет, что они на самом деле один и тот же тип данных, что на самом деле не так. Решение было заменить его на ==