typescript - 带有 typescript 的 Vue2,类型上不存在属性

标签 typescript vuejs2

我有以下 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 |     });

有谁知道我如何解决这个问题,或者解释为什么会发生?

最佳答案

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

原始类型声明位于 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

我认为没有你的对象声明 typescript 会认为 dataDefaultData<V> = object .但是一旦你说它返回一个对象,数据就会突然匹配((this: V) => object)反而。现在 typescript 需要 this类型为 V (我假设它是一个 vue 实例)并且由于该 vue 实例在它的定义中没有 snackbar ,因此,boom, typescript 抛出。

这里有很多猜测,但我认为除了明确返回 object 之外,几乎任何事情都没有。将不匹配 DefaultData<V> 中的第二个签名.

关于typescript - 带有 typescript 的 Vue2,类型上不存在属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50810291/

相关文章:

javascript - 如何从 Angular 构建中排除文件类型?

typescript - gulp typescript 抛出错误 TS2300 : Duplicate identifier 'moment'

angular - 下载 zip 中的许多大文件。正确实现

typescript - 类型 'Promise<any>' 缺少以下属性

vue.js - VueJS : Computed Property Is Calculated Before Created in Component?

typescript - “查询”在类型 'QueryFn' 中不存在 | angularfire2

vue.js - 在vue中添加键盘事件监听器

vue.js - 在 Vue.js 中使用 computed 并且当 mounted 被调用时 computed 属性仍然是空的

css - vueJS 转换旋转样式内联

javascript - 如果 index.html 不加载任何 javascript,Vue 应用程序如何启动?