Ошибка Vue Watch TypeScript TS2769: этому вызову не соответствует ни одна перегрузка

Рассмотрим следующий код:

export default defineComponent({
  setup() {
    const miniState = ref(true)

    const setMiniState = (state: boolean, screenWidth: number) => {
      if (screenWidth > 1023) {
        miniState.value = false
      } else if (state !== void 0) {
        miniState.value = state === true
      }
      else {
        miniState.value = true
      }
    }

    watch('$q.screen.width', (width) => setMiniState(true, width))

    return { miniState, setMiniState }
  }
})

TypeScript выдает эту ошибку:

TS2769: этому вызову не соответствует ни одна перегрузка.
Перегрузка 1 из 3, '(источник: SimpleEffect, параметры?: Pick, "deep" | "flush"> | undefined): StopHandle', выдает следующую ошибку. Аргумент типа "$q.screen.width" не может быть назначен параметру типа SimpleEffect.

Перегрузка 2 из 3, '(источник: WatcherSource, cb: WatcherCallBack, options? Partial | undefined): StopHandle', выдает следующую ошибку. Аргумент типа "$q.screen.width" не может быть назначен параметру типа "WatcherSource".

Перегрузка 3 из 3, '(источники: WatcherSource[], cb: (newValues: unknown[], oldValues: unknown[], onCleanup: CleanupRegistrator) => any, options?: Partial | undefined): StopHandle "дал следующее ошибка. Аргумент типа "$q.screen.width" не может быть назначен параметру типа "WatcherSource[]".

Это для следующей строки кода:

watch('$q.screen.width', (width) => setMiniState(true, width))

В настоящее время я передаю string к watch функция вместо WatcherSource<any>. Я пробовал следующее, но все они терпят неудачу:

watch('$q.screen.width' as WatcherSource, (width) => setMiniState(true, width)) // fails

watch(('$q.screen.width' as WatcherSource ), (width) => setMiniState(true, width)) // fails

Как правильно это решить?

2 ответа

Решение

Вот определениеwatch а также WatcherSource

function watch<T>(
  source: WatcherSource<T>,
  callback: (
    value: T,
    oldValue: T,
    onInvalidate: InvalidateCbRegistrator
  ) => void,
  options?: WatchOptions
): StopHandle

type WatcherSource<T> = Ref<T> | (() => T)

В соответствии с этим вы должны передать ref или callback.

watch(() => $q.screen.width, (width) => setMiniState(true, width))

У меня была эта проблема с Quasar, и оказалось, что VS Code каким-то образом автоматически импортировал неправильный объект «часы» следующим образом:

      import { watch } from 'fs';

вместо

      import { watch } from 'vue';

И именно поэтому он ожидал неправильные параметры типа.

Просто на всякий случай, если у кого-то еще есть такая же проблема.

Ваше здоровье

Другие вопросы по тегам