这是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);
}
这很好用,但我是不是缺少了一些东西来保证这种类型的安全?
2条答案
按热度按时间s8vozzvw1#
一般来说,您会希望将变量设置为字符串,以便一切正常工作。
然后当你想把它作为一个数字使用时,在那个点上转换它。
输入使用字符串类型是有原因的。这样你就可以保持typescript提供的类型安全性。
bvn4nwqk2#
您不需要强制执行!您可以简单地重用事件中保存的信息!
事件对象中的
target
属性对于每一种输入元素都有一个valueAsNumber
属性,它返回的值类型为number。即使它不是type="number"
,valueAsNumber
也等于NaN
。target
中还有一个type
属性,它将等于输入目标上HTML的type
属性。因此,结合这两个属性,您可以: