reactjs 如何处理 typescript 中的数字输入?

xoshrz7s  于 2022-11-29  发布在  React
关注(0)|答案(2)|浏览(135)

这是react/typescript中处理常规输入字段的方式,其中value是类型字符串:

const [value, onChange] = useState<string>('');

const onChange = (e: ChangeEvent<HTMLInputElement>) {
  setValue(e.target.value);
}

return (
  <input
    value={value}
    onChange={onChange}
  />
);

但我在输入类型为number时遇到问题:

const [value, onChange] = useState<number>();

const onChange = (e: ChangeEvent<HTMLInputElement>) {
  // type error
  setValue(e.target.value);
}

return (
  <input
    type="number"
    value={value}
    onChange={onChange}
  />
);

在这个例子中,值的类型是数字,输入的类型是数字(所以假设e.target.value应该总是数字类型。但是根据打印脚本,event.target.value总是字符串。我可以将它转换为数字ie。

const onChange = (e: ChangeEvent<HTMLInputElement>) {
  setValue(Number(e.target.value));
}

但现在如果键入某个数字,用户退格使其为空,则值将变为0 -该字段永远不能为空。
将值保留为字符串,然后在保存时将其转换为数字,这不是一个可行的解决方案
我暂时要做的事情是使e.target.value成为any:

const onChange = (e: ChangeEvent<HTMLInputElement>) {
  setValue(e.target.value as any);
}

这很好用,但我是不是缺少了一些东西来保证这种类型的安全?

s8vozzvw

s8vozzvw1#

一般来说,您会希望将变量设置为字符串,以便一切正常工作。
然后当你想把它作为一个数字使用时,在那个点上转换它。
输入使用字符串类型是有原因的。这样你就可以保持typescript提供的类型安全性。

bvn4nwqk

bvn4nwqk2#

您不需要强制执行!您可以简单地重用事件中保存的信息!
事件对象中的target属性对于每一种输入元素都有一个valueAsNumber属性,它返回的值类型为number。即使它不是type="number"valueAsNumber也等于NaN
target中还有一个type属性,它将等于输入目标上HTML的type属性。
因此,结合这两个属性,您可以:

const value = e.target.type === "number" && !isNaN(e.target.valueAsNumber) ? e.target.valueAsNumber : e.target.value

setValue(value);

相关问题