Почему TypeScript не допускает методы DOM элементов для Vue Ref’ов?



@dicem

Ошибка собственно в методе Vue компонента:

methods: {
...
  dropdownTrigger (e: Event | undefined) {
      if (e) {
        e?.stopPropagation()

        this.$refs.list.scrollTo(0, 0)
        this.isListVisible = !this.isListVisible
        if (!this.isListVisible) this.$refs.input.blur()
        this.selected = this.value
          ? [...this.value]
          : []
      }
  },
...
}

Ошибка указывающая на this.$refs.list.scrollTo(0, 0):

Property 'scrollTo' does not exist on type 'Vue | Element | Vue[] | Element[]'.
Property 'scrollTo' does not exist on type 'Vue'.ts(2339)

Использую дефолтный Nuxt + TypeScript, в @types есть 2 файла:

vue-shim.d.ts

declare module '*.vue' {
  import Vue from 'vue'
  export default Vue
}

tsx-shim.d.ts

import Vue, { VNode } from 'vue';

declare global {
  namespace JSX {
    interface Element extends VNode {}
    interface ElementClass extends Vue {}
    interface IntrinsicElements {
      [element: string]: any;
    }
  }
}


Решения вопроса 1



@yarkov Куратор тега Vue.js

Property ‘scrollTo’ does not exist on type ‘Vue | Element | Vue[] | Element[]’

Ну так всё же написано )) Тип рефа Vue | Element | Vue[] | Element[]
Если точно знаете что это за элемент, то попробуйте так:
(this.$refs.list as HTMLDivElement).scrollTo(0, 0)



2

комментария


Ответы на вопрос 1



@dicem Автор вопроса

Также отличное решение в дополнение к ответу Алексей Ярков

import Vue, { VueConstructor, VNode} from 'vue'

interface Refs {
  $refs: {
    list: HTMLElement,
    input: HTMLInputElement,
  }
}

export default (Vue as VueConstructor<Vue & Refs>).extend({
  ...
  methods: {
    dropdownTrigger (e: Event | undefined) {
      this.$refs.list.scrollTo(0, 0) // наконец то отлично отрабатывает
    }
  }
  ...
})

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *