Vue Typescript 回调:隐含类型为 any

Vue Typescript callback: this implicitly has type any

在我的 vue 组件中使用带有 lodash debounce 的匿名函数作为 watch 选项时,我得到了 typescript 编译器错误“this implicitly has type any.

这是我的组件

export default defineComponent({
  data(){
    return {
       filters:{
          filter1: "foo"
       } as Record<string, string>
    }
  },
  methods:{
    load(){
       //load function
    }
  },
  watch:{
    "filters":{
       deep: true,
       handler:_debounce(function(newValue){
           this.load() // <= hear I got "this implicitly has type any"
       }, 500)
    }
  }
})

我在这个 post 上发现我的匿名去抖动回调函数使用了箭头函数,但错误仍然存​​在 ()

另一种解决方案是将“this:any”作为参数传递给函数,但我发现这非常难看。

_debounce(function(this:any, newValue){
           this.load() // <= hear I got "this implicitly has type any"
       }, 500)

是否有更好的解决方案来处理这个问题? (没有将 noImplicitAny 设置为 false)

尝试使用 'arrow' 函数定义,以保持 this 的范围。

handler:_debounce(() => {
       this.load() 
   }, 500)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

编辑: 对于这种情况,打字稿中的一些设计限制使得难以 detect/assign 隐式 this 的类型(参见 https://github.com/microsoft/TypeScript/issues/38845#issuecomment-651455328) 它应该使用带有类型化参数的函数表达式,在自定义接口中定义,例如:

interface ComponentInterface {
  load(): void
}

然后:

_debounce(function(this:ComponentInterface, newValue){
       this.load()
   }, 500)

你可以在https://v3.vuejs.org/guide/typescript-support.html#using-with-options-api

找到几个使用这种方式定义types/annotations的案例