Как исправить проблемы линтера с миксинами в vue-typescript?

Ситуация:


У меня есть проект, для которого я пытаюсь создать миксины, и методы в миксине реагируют на данные из компонента и других методов. Я получаю ошибки на всех моих компонентах от veture, заявляя, что метод не существует в объединенном экземпляре vue. Код работает, и я вижу, что миксины работают, но мне любопытно, что мне делать, чтобы избавиться от ошибок линтинга, которые я вижу в своем проекте. Я вижу жалобы Vetur на код в vscode, однако я также вижу жалобы на ts-lint в консоли.

Вопрос и ожидания

Что вызывает эти ошибки и как их исправить? Он появляется несколько раз для компонентов, которые используют один и тот же код, и я подумал, что миксины будут хорошей идеей для повторно используемого кода, но это становится проблемой.

Детали и код

Код компонента Vue с миксином

export default Vue.extend({
  name: 'RecentRequests' as string,
  data() {
    return {
      requests: [] as Request[],
      workflows: [] as Workflow[],
      environment: `${process.env.VUE_WEB_API}`,
      search: '',
    }
  },
  async created() {
    await RequestService.getRequest().then((response) => {
      this.$data.requests = response.Data;
    }).catch((err) => {
      this.$data.requests = null;
      this.$data.topFive = null;
      this.$store.dispatch('updateErrorMessage', {message: `${err}`});
      this.$store.dispatch('updateError');
    });
    await WorkflowService.getWorkflow().then((response) => {
      this.$data.workflows = response.Data;
    }).catch((err) => {
      this.$data.requests = null;
      this.$data.topFive = null;
      this.$store.dispatch('updateErrorMessage', {message: `${err}`});
      this.$store.dispatch('updateError');
    });
  },
  mixins: [globalMixins],
  computed: {
    filteredRequests() {
      let searchTerm = this.search.toLowerCase();
      let topFive: any = this.topFive()
      if(this.search === null || this.search === '') {
        return topFive
      } else {
        return topFive.filter((item: any) => {
            return item.WorkflowDisplayName.toLowerCase().includes(searchTerm);
        });
      }
    }
  },
  methods: {
    topFiveRequests() {
      // combine workflows first before running
      this.combineRequestsAndWorkflows(this.$data.requests, this.$data.workflows);
      // make copy of requests array
      const requestsCopy = this.$data.requests.map((x: Request) => x);
      // sort array by most recent
      const mostRecentRequests = requestsCopy.sort((a: any, b: any) => {
        const dateA: any = new Date(a.timeRequested);
        const dateB: any = new Date(b.timeRequested);
        return dateB - dateA;
      });
      const result = mostRecentRequests.splice(0, 4);
      return result;
    },
  },
})
</script>

Скриншот ошибки с Vetur

Скриншот ошибки на экране

Скриншот ошибки с tsLint в консоли

введите описание изображения здесь

I


person Sanwil9    schedule 08.12.2019    source источник


Ответы (1)


Проблема в том, что Typescript недостаточно умен, чтобы знать, какие миксины на самом деле есть во Vue. У вас есть 2 варианта:

  1. Поскольку миксин расширяет Vue, в вашем компоненте вместо Vue.extend вы можете использовать YourMixin.extend. Обратите внимание, что это решение будет работать только в случае одного миксина.
  2. Если в компоненте более одного миксина, вы можете проверить эту зависимость.

Дополнительную информацию можно найти на форуме.

person MartinT    schedule 09.12.2019
comment
Спасибо вам за помощь. Я буду продолжать читать это, чтобы убедиться, что я понимаю машинописный текст на необходимом мне уровне. - person Sanwil9; 09.12.2019