【问题标题】:Type 'unknown' is not assignable to type '(prevState: number | undefined) => number | undefined'类型 'unknown' 不可分配给类型 '(prevState: number | undefined) => number |不明确的'
【发布时间】:2021-06-22 17:01:21
【问题描述】:

我正在使用材质ui的选择组件将选择的值保存在变量中:

const [ratio, setRatio] = useState<number>();
...
const handleChangeRatio = (e: React.ChangeEvent<{ name?: string | undefined; value: unknown; }>) => {
    //const value = typeof e.target.value === "number" ? e.target.value : "";
    setRatio(e.target.value);
};
...
    <Select
        labelId="demo-simple-select-filled-label"
        id="demo-simple-select-filled"
        value={splittingMethod}
        onChange={(e)=>handleChangeRatio(e)}
    >
        <MenuItem value={0}>
            0
        </MenuItem>
        <MenuItem value={0.1}>0.1</MenuItem>
        <MenuItem value={0.2}>0.2</MenuItem>
    </Select>

但是,我在 handleChange 函数中设置状态时出现此错误,我该如何解决?

Argument of type 'unknown' is not assignable to parameter of type 'SetStateAction<number | undefined>'.
  Type 'unknown' is not assignable to type '(prevState: number | undefined) => number | undefined'.

【问题讨论】:

    标签: javascript reactjs typescript react-native setstate


    【解决方案1】:

    React 的 useState&lt;number&gt;() 返回一个值元组,其类型为:ratio: number | undefinedsetRatio: SeStateAction&lt;number | undefined&gt;。当您尝试向setRatio 类型的unknown 值提供值时。

    最简单的方法是narrow 类型unknownnumber

    const handleChangeRatio = (e: React.ChangeEvent<{ value: unknown }>) => {
        if (typeof e.target.value === 'number') setRatio(e.target.value)
    };
    

    或具有更好的运行时安全性:

    const handleChangeRatio = (e: React.ChangeEvent<{ value: unknown }>) => {
        const value = Number(e.target.value)
        if (!isNaN(value)) setRatio(value)
    };
    

    【讨论】:

    • 这似乎在前端工作正常,但在控制台上给出错误VM334:1 Uncaught (in promise) SyntaxError: Unexpected token P in JSON at position 0
    • 我相信这与事件处理程序无关。当尝试将 text 响应/数据解析为 JSON 时,Unexpected token ... in JSON 是一个常见问题。
    猜你喜欢
    • 2022-10-15
    • 2020-08-07
    • 2020-08-04
    • 1970-01-01
    • 2022-10-22
    • 2017-01-05
    • 2021-09-18
    • 2023-01-11
    • 2022-01-16
    相关资源
    最近更新 更多