Использование декоратора свойств Vue
Vue-property-decorator , который внутренне реэкспортирует декораторы из vue-class-component , предоставляет серию декораторов машинописного текста, которые дают действительно хороший смысл. Вы должны использовать класс API хотя.
@Inject
и @Provide
- два таких декоратора:
В провайдере:
import {Vue, Component, Provide} from 'vue-property-decorator';
@Component
export default class MyClass {
@Provide('service') service: Service = new MyServiceImpl(); // or whatever this is
}
В предоставленном компоненте:
import {Vue, Component, Inject} from 'vue-property-decorator';
@Component
export default class MyClass {
@inject('service') service!: Service; // or whatever type this service has
mounted() {
console.log(this.service); // no typescript error here
},
}
Я считаю, что это оптимальное решение, в том смысле, что оно дает лучший смысл при работе с Vue.
Однако теперь вы можете не захотеть изменять определение всех ваших компонентов или просто не можете этого сделать из-за внешних ограничений. В таком случае вы можете сделать следующий трюк:
Кастинг
Вы можете разыграть this
любого, когда вы собираетесь использовать this.service
. Не самая лучшая вещь, но она работает:
mounted() {
console.log((this as any).service);
},
Должны быть другие способы, но я больше не привык к Vue.extends
API. Если у вас есть время и возможность, я настоятельно рекомендую вам переключиться на API класса и начать использовать декораторы vue-property-decorators, они действительно дают лучший смысл.