带有打字稿的Vue2,类型上不存在属性

Posted

技术标签:

【中文标题】带有打字稿的Vue2,类型上不存在属性【英文标题】:Vue2 with typescript, Property does not exist on type 【发布时间】:2018-11-21 10:41:32 【问题描述】:

我有以下 Vue 组件:

<template>
    <v-snackbar bottom :color="color" v-model="snackbar">
         msg 
        <v-btn flat @click.native="close()">Close</v-btn>
    </v-snackbar>
</template>

<script lang="ts">
    import Vue from 'vue';
    import VueEvent from '../../VueEvent';

    export default Vue.extend(
        data(): object 
            return 
                snackbar: false,
                msg: '',
                color: '',
            ;
        ,
        created() 
            VueEvent.listen('snackbar', (data) => 
                this.snackbar = true;
                this.msg = data.msg;
                this.color = data.color;
            );
            this.malert();
        ,
        methods: 
            close(): void 
                this.snackbar = false;
            
        
    );
</script>

<style scoped>

</style>

Typescript 编译时出现以下错误:

Property 'snackbar' does not exist on type 'CombinedVueInstance<Vue, object,  close(): void; , , Readonly<Record<never, any>>>'.
    28 |         methods: 
    29 |             close(): void 
  > 30 |                 this.snackbar = false;
       |                      ^
    31 |             
    32 |         
    33 |     );

有谁知道我该如何解决这个问题,或者解释一下为什么会这样?

【问题讨论】:

你能将close(): void 声明为箭头函数吗? 然后我得到更多的错误。我可以通过 (this as any).snackbar 解决它,但它应该可以工作。我看过很多例子,这就是它的完成方式。我也在使用文档中所述的垫片 也许对***.com/questions/56002310/…有帮助。 【参考方案1】:

好吧,我没有给你一个好的答案,但我有理论:

原始类型声明位于 vue/types/options.d.ts:

type DefaultData<V> =  object | ((this: V) => object); // here is the kicker
Data=DefaultData<V>
data?: Data;

我发现:

data():object  ... // this.snackbar does not exist
data() ... // this.snackbar does exist.
data(): any  ... // this.snackbar does exist.
data():  snackbar: boolean; msg: string; color: string   ... // Also valid

我认为没有你的对象声明打字稿会认为dataDefaultData&lt;V&gt; = object。但是一旦你说它返回一个对象,数据就会突然匹配((this: V) =&gt; object)。现在 typescript 期望 thisV 类型(我假设它是一个 vue 实例),并且由于该 vue 实例在它的定义中没有小吃栏,所以繁荣,打字稿抛出。

这里有很多猜测,但我认为几乎所有除了明确返回object的东西都可以与DefaultData&lt;V&gt;中的第二个签名不匹配。

【讨论】:

这解决了,我想我真的应该为我的数据创建一个接口吗?总之,问题解决了,谢谢

以上是关于带有打字稿的Vue2,类型上不存在属性的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 VSCode 中的“‘CombinedVueInstance’类型上不存在属性 XX”错误? (带有打字稿的Vue)

带有打字稿的 Apollo 网关不会在上下文中接受用户 ID

与打字稿反应:“历史”类型上不存在属性“推送”

类型上不存在属性。打字稿

解决打字稿错误的最佳方法 - 类型上不存在属性

类型“typeof File”离子打字稿上不存在属性“moveFile”