vuejs2 - Hvorfor gjenkjenner ikke TypeScript modulutvidelse for en Vue-plugin?


Jeg har et Vue-prosjekt som jeg bygger for å lære både Vue og TypeScript. Prosjektet har en bit med statiske data som jeg har valgt å gjøre tilgjengelig for komponenter som en Vue-plugin, ved å legge til en egenskap på Vue-prototypen.

import _Vue from 'vue';

export default function myPlugin(Vue: typeof _Vue): void {
  Vue.prototype.$myPlugin = { one: 1, two: 2 };
}

Jeg fulgte rådet i et innlegg av Peter Kuhn og definerte egenskapstypen i en test-plugin.d.ts-fil.

import Vue from 'vue';

declare module 'vue/types/vue' {
    interface Vue {
        $myPlugin: object;
    }
}

Endelig importerer jeg og bruker() pluginen.

import Vue from 'vue';
import App from './App.vue';
import MyPlugin from './test-plugin';

Vue.use(MyPlugin);

new Vue({
  render: (h) => h(App),
}).$mount('#app');

Men når jeg refererer til egenskapen i en enkeltfil Vue-komponent, gir både vscode og TypeScript-transpileren en feil om at egenskapen ikke eksisterer.

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
  name: 'HelloWorld',
  props: {
    msg: String,
  },
  data: {
    one: 0,
  },
  created(): void {
    this.one = this.$myPlugin.one;
  },
});
</script>

Feilen:

ERROR in /Users/kccricket/Projects/what-the-heck/vue-plugin-test/src/components/HelloWorld.vue
43:21 Property '$myPlugin' does not exist on type 'CombinedVueInstance<Vue, { one: number; }, {}, {}, Readonly<{ msg: string; }>>'.
    41 |   },
    42 |   created(): void {
  > 43 |     this.one = this.$myPlugin.one;
       |                     ^
    44 |   },
    45 | });
    46 | </script>

Til tross for feilen, this.one === 1 som jeg forventer når koden er bygget og kjørt. Kan noen påpeke hva jeg gjør galt her?

Jeg har lagt ut eksempel-koden på GitHub: https://github.com/kccricket/what-the-heck/tree/master/vue-plugin-test

Miljø

"dependencies": {
  "vue": "^2.5.16"
},
"devDependencies": {
  "@vue/cli-plugin-typescript": "^3.0.0-rc.5",
  "@vue/cli-service": "^3.0.0-rc.5",
  "vue-template-compiler": "^2.5.16"
}

Svar #1

Når du utvider Vue-typing for bruk med en plugin - som i test-plugin.d.ts - må du importere Vue først:

import Vue from 'vue'

declare module 'vue/types/vue' {
  interface Vue {
   $myPlugin: object 
  } 
}

Det er forklart her i dokumentasjonen.

oppdatering

Jeg ser ikke at det er nevnt i innlegget ditt, men hvis du ikke har gjort det, trenger du også en shim for enkeltfilkomponenter:

// sfc.d.ts
declare module '*.vue' {
  import Vue from 'vue'
  export default Vue
}

Du kan se dette i TypeScript-Vue-Starter-repositoriet.

oppdatering

Se bort fra det ovenstående, jeg la ikke merke til prøve-repoet. Jeg klarte å løse typefeilen, se endringene her.

svar

Som påpekt av @kccricket, hadde pluginens implementerings- og deklarasjonsfiler samme navn, noe som dermed forårsaket at modulen ble løst feil.

// original file names

test-plugin.ts
test-plugin.d.ts

Svar #2

Det som fungerte for meg, var å ha følgende deklarasjon inne i .ts-pluginfilen:

declare module 'vue/types/vue' {
  interface Vue {
    $myPlugin: object;
  }
}

Jeg prøvde å ha det samme i .d.ts-filen som anbefalt i den artikkelen, men Intellisense kunne fortsatt ikke se det riktig i komponentkoden.

Relaterte artikler