Vue观察类型脚本错误TS2769:没有与此调用匹配的重载

amrnrhlw  于 2022-11-30  发布在  Vue.js
关注(0)|答案(2)|浏览(595)

请考虑以下代码:

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掷回这个错误:
TS 2769:没有与此调用匹配的重载。
过载1/3,'(来源:简单效果,选项?:摘,“深”|“刷新”〉|未定义):StopHandle ',出现以下错误。类型“"$q.screen.width”“的参数不能赋给类型”SimpleEffect“的参数。
过载3之2,'(来源:监视器源,cb:WatcherCallBack,选项-部分|未定义):StopHandle ',出现以下错误。类型“"$q.screen.width”“的参数不能赋给类型”WatcherSource“的参数。
超载3之3,'(来源:监视程序源[],cb:(新值:未知[],旧值:未知[],清除时:清理注册器)=〉任何,选项?:部分|未定义):StopHandle ',出现以下错误。无法将类型“"$q.screen.width”“的参数分配给类型”WatcherSource[]“的参数。
这适用于以下代码行:

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

现在,我将string而不是WatcherSource<any>传递给watch函数。我尝试了以下方法,但都失败了:

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

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

解决这个问题的正确方法是什么?

klsxnrf1

klsxnrf11#

这是definition of watch and 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))
kdfy810k

kdfy810k2#

我在使用Quasar时遇到过这个问题,结果是VS代码不知何故自动导入了错误的“watch”对象,如下所示:

import { watch } from 'fs';

代替

import { watch } from 'vue';

这就是为什么它需要错误的类型参数。
只是提醒一下,以防其他人也有同样的问题。
干杯

相关问题