У меня есть код машинописного текста, который собирает шаги формы, и он выдает мне ошибку во время сборки, это функция, и она дает мне ошибку в строке:

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
CodeG 8 Июн 2021 в 21:59

3 ответа

Лучший ответ

Похоже, вы не хотите, чтобы тип visitedForms был never[], но вы написали:

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

Который выводит тип never[] из значения по умолчанию [].

Вместо этого добавьте аннотацию к useState предполагаемым типом:

const [visitedForms, setVisitedForms] = useState<number[]>([])
1
Ben West 8 Июн 2021 в 20:49

Это определение SetStateAction.

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

Это означает, что либо аргумент для setVisitedForms должен иметь тип S, либо это должна быть функция, которая принимает тип S и возвращает тип S.

S - общий. Вы можете прочитать о них в документации по машинописным текстам.

Typescript считает, что visibleForms - это пустой массив: never[], а currentIndex - это число. Обратный вызов setVisitedForms должен возвращать тот же тип, который он получает, которым в вашем случае является never[], но поскольку currentIndex - это число, он возвращает number[]. Вам нужно исправить setVisitedForms, чтобы все, что он передает в обратный вызов, было типа number[].

0
Charles Bamford 8 Июн 2021 в 19:17

Вы должны добавить тип для аргумента seenForms. В этом случае number[]

setVisitedForms((seenForms: number[]) => [...seenForms, currentIndex].sort((x, y) => x - y));
0
Nidin Vinayakan 8 Июн 2021 в 19:33