我有以下 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>
Run Code Online (Sandbox Code Playgroud)
当 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 | });
Run Code Online (Sandbox Code Playgroud)
有谁知道我如何解决这个问题,或者解释为什么会发生?
好吧,我没有一个好的答案给你,但我有理论:
原始类型声明位于 vue/types/options.d.ts 中:
type DefaultData<V> = object | ((this: V) => object); // here is the kicker
Data=DefaultData<V>
data?: Data;
Run Code Online (Sandbox Code Playgroud)
我发现:
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
Run Code Online (Sandbox Code Playgroud)
我认为如果没有你的对象声明打字稿会认为那 data是DefaultData<V> = object。但是一旦你说它返回一个对象,数据就会突然匹配((this: V) => object)。现在,typescript 期望this是一种类型V(我假设是一个 vue 实例),并且由于该 vue 实例的定义中没有小吃栏,因此,typescript 会抛出异常。
这里有很多猜测,但我认为除了显式返回object之外,几乎任何东西都可以与DefaultData<V>.
| 归档时间: |
|
| 查看次数: |
8499 次 |
| 最近记录: |