具有 vue-class-components 和 typescript 的 vuejs 实例属性时出错
Posted
技术标签:
【中文标题】具有 vue-class-components 和 typescript 的 vuejs 实例属性时出错【英文标题】:Error having vuejs instance properties with vue-class-components and typescript 【发布时间】:2020-11-21 18:50:22 【问题描述】:我想为我的服务器的 url 设置一个全局变量。
我把这个写在我的 main.ts 上
Vue.prototype.$apiUrl = "http://localhost:3000";
然后尝试在 App.vue 中使用它
console.log(this.$apiUrl)
我可以在浏览器的控制台中看到 url。
但是我收到了这个错误:
Property '$apiUrl' does not exist on type 'App'.Vetur(2339)
我无法继续,因为在应用程序的某些部分 this.$apiUrl 由于某种原因未定义。
我该如何解决?
【问题讨论】:
【参考方案1】:注意Class API proposal 已被废弃。要在 Vue 3 发布之前使用 Vue + Typescript,最好使用Vue.extend()
组件样式:
<script lang="ts">
import Vue from 'vue';
export default Vue.extend(
...
)
</script>
要向您的 Vue 实例添加全局类型,请阅读 Typescript Support。
具体来说,您应该将其添加到您的垫片中:
import Vue from 'vue'
declare module 'vue/types/vue'
interface Vue
$apiUrl: string;
【讨论】:
:o 很遗憾,我不知道 class-components 不会在 vue3 中使用... :'( 谢谢 最终的论点(根据 Evan You 的说法)是它产生的问题多于解决的问题,特别是 Typescript(这是添加它的主要原因)。如果您对更多细节感兴趣,请观看 this talk Evan 谈到该主题,以及 Vue 3 背后的其他基本原理和设计原则以及从 2 过渡。 但是,vue-class-component 目前与 Vue 2 兼容并且可以很好地工作,并且至少在 Vue 3 准备好生产之前它可能会得到维护。我个人的观点是你不应该为此烦恼,因为它总是会遇到更复杂的情况(即:Vuex),所以你最好花时间学习 Vue 3,它完全用 Typescript 编写,不需要任何变通方法用于打字稿。 FWIW 听起来像 vue-class-component may still be supported 与 Vue 3。我碰巧在我的第一个 Vue/Typescript 项目中使用它,这样会很好。 @totalhack,vue-class-component
现在是一个独立开发的插件。它不再被 Vue 嵌入或认可。这意味着当您遇到任何实现问题时,您将无法向整个 Vue 社区询问,您将仅限于 vue-class-component
插件的维护者和用户。【参考方案2】:
解决了!我需要将 $apiUrl 添加到 Vue 的类型中
我在 @types 文件夹中创建了一个 .d.ts 文件并添加以下内容
import Vue from 'vue'
declare module 'vue/types/vue'
interface Vue
$apiUrl: string
【讨论】:
以上是关于具有 vue-class-components 和 typescript 的 vuejs 实例属性时出错的主要内容,如果未能解决你的问题,请参考以下文章
vue-class-component:如何创建和初始化反射数据
如何设置 Webpack 以便能够在单文件组件(.vue)和“vue-class-component”类中使用 Pug?
vue-class-component : 调用类方法时 TS2339
Vuelidate 与 Vue 3 + vue-class-component + TypeScript
vue-class-component 以class的模式写vue组件
vue-class-component + typescript:如何在导入的函数中使用组件的类作为“this”的类型?