类型为 never[] 的 Typescript 参数不可分配给类型为 SetStateAction<never[]>

时间:2021-06-08 18:59:14

标签: javascript typescript

我有一个组合表单步骤的打字稿代码,它在构建时给我一个错误,这是函数,它在线上给我一个错误:

setVisitedForms((seenForms) => [...seenForms, currentIndex].sort((x, y) => x - y));

  const push = useCallback(
    (form = nextForm) => {
      if(!!currentForm) {
        const currentIndex = forms.indexOf(currentForm);
        if (currentIndex >= 0) {
          setVisitedForms((seenForms) => [...seenForms, currentIndex].sort((x, y) => x - y));
        }
        history.push(`${baseurl}${form}`);
      }
    },
    [baseurl, history, nextForm, currentForm, forms, setVisitedForms]
  );

这是出现在控制台上的错误。有谁知道我做错了什么?

Argument of type '(seenForms: never[]) => number[]' is not assignable to parameter of type 'SetStateAction<never[]>'.

3 个答案:

答案 0 :(得分:1)

听起来您不打算将 visitedForms 的类型设为 never[],但您写道:

const [visitedForms, setVisitedForms] = useState([])

从默认值 never[] 推断类型 []

相反,用预期的类型注释 useState

const [visitedForms, setVisitedForms] = useState<number[]>([])

答案 1 :(得分:0)

这是 SetStateAction 的定义。

type SetStateAction<S> = S | ((prevState: S) => S);

这意味着 setVisitedForms 的参数要么必须是类型 S,要么必须是一个接受类型 S 并返回类型 S 的函数。

S 是泛型。您可以在打字稿文档中阅读它们。

Typescript 认为 seenForms 是一个空数组:never[],而 currentIndex 是一个数字。 setVisitedForms 回调必须返回与接收到的类型相同的类型,在您的情况下为 never[],但由于 currentIndex 是一个数字,因此它返回 number[]。您需要修复 setVisitedForms 以便它传递给回调的任何内容都是 number[] 类型。

答案 2 :(得分:0)

您应该为 seenForms 参数添加类型。在这种情况下number[]

setVisitedForms((seenForms: number[]) => [...seenForms, currentIndex].sort((x, y) => x - y));