Búsqueda de sitios web

javascript - Creación de plugins personalizados con TypeScript en Nuxt


En mi proyecto Nuxt, creé un archivo de plugin personalizado que devuelve un objeto. /helpers/settings:

export const settings = {
  baseURL: 'https://my-site.com',
  ...
};

Registro este archivo en /plugins/settings.ts:

import Vue from 'vue';
import { settings } from '~/helpers/settings';

Vue.prototype.$settings = settings;

Y en nuxt.config.js:

export default {
  ...
  plugins: [
    '~/plugins/settings',

Luego, en un componente, puedo usar mi complemento así:

export default Vue.extend({
  data() {
    return {
      url: `${this.$settings.baseURL}/some-path`,

Todo funciona como se esperaba, excepto que en mi consola, obtengo un error de TypeScript en la línea en la que me refiero a mi plugin en mi componente:

Property '$settings' does not exist on type 'CombinedVueInstance<Vue, unknown, unknown, unknown, Readonly<Record<never, any>>>'.

De ahí mi pregunta: ¿cuál es la manera correcta de aplicar un tipo a mi complemento personalizado para que no reciba este error cada vez que lo uso?

Respuesta #1

Según la documentación, necesitarás aumentar el archivo de tipos para Vue.

Coloca el siguiente código en un archivo llamado plugin-types.d.ts.

// 1. Make sure to import 'vue' before declaring augmented types
import Vue from 'vue'

// 2. Specify a file with the types you want to augment
//    Vue has the constructor type in types/vue.d.ts
declare module 'vue/types/vue' {
  // 3. Declare augmentation for Vue
  interface Vue {
    $settings: string
  }
}

Respuesta #2

Esta respuesta también funciona, pero encontré una manera más fácil, aunque más sucia, de solucionarlo sin la necesidad de agregar el archivo plugin-types.d.ts.

Simplemente agrega una propiedad a tu componente con el nombre del plugin como sigue:

@Component
export default class YourComponent extends Vue {
  private $settings!: string; // your plugin here
  private url: string = `${this.$settings.baseURL}/some-path`
}