使用 TypeScript 编译 Vue 时出错

Posted

技术标签:

【中文标题】使用 TypeScript 编译 Vue 时出错【英文标题】:Errors compiling Vue with TypeScript 【发布时间】:2019-08-01 04:53:29 【问题描述】:

在带有 TypeScript 的 Vue 中多次使用带有模板的组件

我的目标是在另一个组件中多次使用带有模板的组件。 代码在 .html 和 .ts 文件中分开。

.html 看起来像这样:

<template>
    <div id="app">
        <inner-component></inner-component>
        <hr />
        <inner-component></inner-component>
        <hr />
        <inner-component></inner-component>
    </div>
</template>

<script src="./componenttest.ts"></script>

虽然 .ts 是这样的:

import Vue from 'vue';
import  Component  from 'vue-property-decorator';

export interface IStatus extends Vue 
    status: string;


var InnerComponent = Vue.extend(
    template: '<p>Server Status:  status (<button @click="changeStatus">Change</button>)</p>'
)

@Component(
    data: function (): IStatus 
        return  status: 'Critical'
    ,
    components:  InnerComponent ,
    methods: 
        changeStatus: function (): void 
            this.status = 'Normal';
        
    
)
export default class ComponentTestComponent extends Vue 

运行项目会导致以下错误消息:

[at-loader] TS2322 中的错误:类型 ' status: string; ' 不可分配给类型 'IStatus'。

[at-loader] TS2322 中的错误:类型 ' status: string; ' 不可分配给类型 'IStatus'。 ' status: string; 类型中缺少属性 '$data' '。

[at-loader] TS2339 中的错误:“Vue”类型上不存在属性“状态”。

如果我删除数据标签中的 IStatus 接口标记,我得到的唯一错误消息是:

[at-loader] TS2339 中的错误:“Vue”类型上不存在属性“状态”。

我尝试在ComponentTestComponent中实现我的接口,但错误依旧。

我的猜测是,界面缺少一些细节,所以 TypeScript 不会生成它。最终 Vue 实例因此无法访问 status 属性。

【问题讨论】:

不要将@Component 对象用于应该类定义中的东西(datamethods)。 感谢您的建议,我会记住这一点,但主要问题是此错误消息: [at-loader] TS2339 中的错误:“Vue”类型上不存在属性“状态” . 【参考方案1】:

发生编译错误是因为IStatus 接口正在扩展Vue 并且Vue 接口需要的不仅仅是“状态”属性。

试试这个:

export interface IStatus 
    status: string;

【讨论】:

是的,没错,这是我创建界面的第一种方式。但主要错误消息仍然存在:[at-loader] TS2339 中的错误:“Vue”类型上不存在属性“状态”。【参考方案2】:

好像缺少这段代码:

declare module 'vue/types/vue' 
    interface Vue 
        status: string
    

这是使用附加属性扩展 Vue 实例所必需的。

说实话,文档中包含此内容,只是我不确定此场景的用法。

https://vuejs.org/v2/guide/typescript.html#Augmenting-Types-for-Use-with-Plugins

【讨论】:

【参考方案3】:

如果有人还在苦苦挣扎,请使用 vue cli 而不是手动创建和导入商店

npx @vue/cli 添加 vuex

【讨论】:

以上是关于使用 TypeScript 编译 Vue 时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 graphql 文件编译 Typescript 时出错

TypeScript 导入 vue 包时出错(vue-cli3 proj)

Typescript 在使用 create react app 进行编译时不会出错

Vue 在编译时使用 Typescript 类型检查道具

具有 vue-class-components 和 typescript 的 vuejs 实例属性时出错

尝试在 typescript 项目中使用 recharts 时出错