Vue + Typescript - 使用基于类的装饰器导入错误

Posted

技术标签:

【中文标题】Vue + Typescript - 使用基于类的装饰器导入错误【英文标题】:Vue + Typescript - Import errors with class based decorators 【发布时间】:2021-01-23 12:29:54 【问题描述】:

我正在尝试使用 TypeScript 和基于类的组件来设置 Vue 3。但是,我在导入 Component 装饰器和 Vue 构造函数时不断出错:

This expression is not callable. Type 'typeof
import("/Users/*folder*/node_modules/vue-class-component/dist/vue-class-component")'
has no call signatures. Vetur(2349)

mycode.vue:

<script lang="ts">
import Vue from 'vue'
import Component from 'vue-class-component'

@Component // 1st Error '@Component'
export default class ProdItem extends Vue  // 2nd error 'Vue'
  

</script>

【问题讨论】:

【参考方案1】:

您可能正在尝试使用来自官方 vue-class-component 文档的示例,但目前是针对 7x 版本,它只能与 Vue 2 一起使用。

Vue 3 需要 vue-class-component 8x,这还没有记录,但您可以参考描述更改的 vue-class-component Issue #406。与您的问题相关的通知:

@Component 将重命名为 @Options。 如果您没有声明任何选项,@Options 是可选的。 Vue 构造函数由 vue-class-component 包提供。

由于您的组件没有选项,您可以从组件中省略 @Options 装饰器:

// BEFORE:
import Component from 'vue-class-component'
@Component
class 

// AFTER:
/* no options used, so no @Options decorator needed */
class 

此外,Vue 3 不再导出 Vue 构造函数,但 vue-class-component 会,因此您的组件必须改为扩展它:

// BEFORE:
import Vue from 'vue'

// AFTER:
import  Vue  from 'vue-class-component'

作为参考,您可以使用Vue CLI 生成一个Vue 3 + TypeScript 项目,以使用如上所述的最新vue-class-component 的工作示例。

【讨论】:

【参考方案2】:

基于这个issue 和这个one 你可以这样做:

<script lang="ts">

import vue from 'vue-class-component'


export default class ProdItem extends Vue  
  

</script>

【讨论】:

【参考方案3】:

使用装饰器,您不需要()。 试试

<script lang="ts">
import Vue from 'vue'
import Component from 'vue-class-component'

@Component  // 1st Error '@Component'
export default class ProdItem extends Vue  // 2nd error 'Vue'
  

</script>

【讨论】:

对不起,我不小心把那个放在那里了。我刚刚编辑了帖子。道歉

以上是关于Vue + Typescript - 使用基于类的装饰器导入错误的主要内容,如果未能解决你的问题,请参考以下文章

从 TypeScript 功能的角度来看,Vue.js 3 是不是可以实现基于类的语法?

Vue+TypeScript使用教程-快速入门

基于类的vue组件的标签名称是啥

基于 Vue2 类的数据属性不是反应式的

vue-cli3+typescript+router

Vue+TypeScript项目实践(一)