【问题标题】:Argument of type 'number' is not assignable to parameter of type 'SetStateAction<{ count1: number; count2: number; }>''number' 类型的参数不能分配给 'SetStateAction<{ count1: number; 类型的参数; count2:数字; }>'
【发布时间】:2021-09-01 04:41:39
【问题描述】:

我尝试使用 typescript 实现计数器,但出现错误提示:

“'number' 类型的参数不可分配给'SetStateAction' 类型的参数”。
当我单击按钮时,p 标签会消失。

这是代码,我用粗体突出显示了错误部分:

import React, { useState } from "react";


 
export const UseStateP: React.FC = () => {
  const [{count1,count2}, setCount] = useState ({count1:0, count2:5});
  console.log(count1,count2) // 0, 5
  return (
    <div>
      <p>{count1}</p>
      <p>{count2}</p>
      <button onClick={() => setCount(count1+1)}>Add1</button>
      <button onClick={() => setCount(count2+5)}>Add5</button>
    </div>
  );
};

【问题讨论】:

    标签: reactjs typescript object react-hooks numbers


    【解决方案1】:

    因为你的状态是一个对象。所以你需要更新你的setCount 来更新对象

    setCount((preState) => ({
      ...preState,
      count1: count1 + 1,
    }));
    

    【讨论】:

      【解决方案2】:

      发生错误是因为从这行setCount(count1+1)setCount(count2+5)

      您的原始状态期望有一个 count1count2 的对象,但是当您设置状态时,您只放弃一个。

      因此,解决方案是将两个变量从原始状态放回原处,如下所示:

      onClick={() => setCount({ count1: count1 + 1, count2 })}
      

      所以整个组件变成:

      export const UseStateP: React.FC = () => {
        const [{ count1, count2 }, setCount] = useState<{
          count1: number;
          count2: number;
        }>({ count1: 0, count2: 5 });
        return (
          <div>
            <p>{count1}</p>
            <p>{count2}</p>
            <button
              type="button"
              onClick={() => setCount({ count1: count1 + 1, count2 })}
            >
              Add1
            </button>
            <button
              type="button"
              onClick={() => setCount({ count1, count2: count2 + 5 })}
            >
              Add5
            </button>
          </div>
        );
      };
      

      另外,请记住将button typeHTML Standard 形式添加到您的按钮元素中

      Viet 的回答也是满足打字稿期望并修复类型错误的另一个更短的解决方案。

      【讨论】:

      • 感谢您的解释,非常有帮助!
      • 您可以考虑接受适合您需求的答案,这对我们这些回答者来说意义重大。
      猜你喜欢
      • 2022-11-12
      • 1970-01-01
      • 2020-04-04
      • 2018-08-15
      • 2021-07-21
      • 2021-01-03
      • 2020-06-19
      • 2019-10-23
      • 2020-06-19
      相关资源
      最近更新 更多