我有一个组合表单步骤的打字稿代码,它在构建时给我一个错误,这是函数,它在线上给我一个错误:
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[]>'.
答案 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));