#typescript #vue.js #vue-mixin #vue-property-decorator
#typescript #vue.js #vue-микширование #vue-свойство-декоратор
Вопрос:
Я использую пакет vue-property-decorator и хочу использовать метод микширования внутри крючка beforeRouteEnter.
Что я сделал:
import { Component, Mixins } from 'vue-property-decorator';
import { myMixin } from '../mixins';
@Component({})
export default class myClass extends Mixins(myMixin) {
beforeRouteEnter(to, from, next) {
next(vm => {
vm.callMixinMethod();
})
}
}
Это связано с проблемой, так как to
, from
, next
и vm
не присваиваются их соответствующим типам автоматически.
Итак, что мне нужно сделать, это поместить beforeRouteEnter в @Component
@Component({
beforeRouteEnter(to, from, next) {
next(vm => {
vm.callMixinMethod();
})
}
})
Это решает проблему типов, они подбираются автоматически. Но это создает другую проблему. Метод смешивания внутри @Component не определен. В нем говорится
Property 'callMixinMethod' does not exist on type 'Vue'
Я попытался зарегистрировать микширование внутри @Component следующим образом:
@Component({
mixins: [myMixin],
beforeRouteEnter...
})
Но это не помогло.
Есть ли какой-нибудь способ заставить beforeRouteEnter подключаться внутри @Component, чтобы каким-то образом видеть методы импортированных миксинов? Может быть, как-то расширить vm
с помощью mixins?
Комментарии:
1. Вероятно, вы могли бы перегрузить сигнатуру вызова
@Component
, увеличив ее. Более простым решением является явный вызов декоратора.export default Component({})(class extends Mixins(myMixin) {...}
Ответ №1:
Я выяснил, что мы можем назначить тип виртуальной машине вручную следующим образом:
@Component({
beforeRouteEnter(to, from, next) {
next(vm: myClass amp; myMixin => {
vm.callMixinMethod();
})
}
})
export default class myClass extends Mixins(myMixin) {
}
И мой микширование выглядит следующим образом:
@Component({})
export default class myMixin extends Vue {
public callMixinMethod() {
// do smth
}
}