typescript - vue 类组件 : TS2339 when calling class method

标签 typescript vue.js vuejs2 vue-class-components

我正在使用 vue-cli-service 构建我的 vuejs 应用程序。

构建成功,但在 webstorm IDE 中,出现一些 TS2339 错误:

测试.vue:

<template>
    <div>{{method()}}</div>
</template>

<script lang="ts">
    import { Component, Vue } from 'vue-property-decorator';

    @Component
    export default class Test extends Vue {
        public method(): string {
            return 'hello';
        }
    }
</script>

测试.spec.ts:

import 'jest';
import {mount} from '@vue/test-utils';
import Test from '@/views/common/Test.vue';

describe('Test.vue', () => {
    let wrapper: any;

    beforeEach(() => {
        wrapper = mount(Test);
    });

    test('test method call', () => {
        const test = wrapper.find(Test).vm as Test;
        expect(test.method()).toEqual('hello');
    });
});

在 Test.spec.ts 中,我在编辑器和 typescript 窗口中都遇到了这个错误:

Error:(14, 21) TS2339: Property 'method' does not exist on type 'Vue'.

但是测试没问题,所以test.method()在运行时解析成功。

最佳答案

根据史蒂文的回答,我了解到 shims-vue.d.ts 是将组件用作 typescript 类所必需的。但问题是它们都被视为 Vue 实例。 查看此文件内容时,这一点很明显:

declare module '*.vue' {
  import Vue from 'vue';
  export default Vue;
}

目前,我发现的唯一干净的方法是声明一个由我的组件实现的接口(interface):

模型.ts:

export interface ITest {
    method(): void;
}

测试.vue:

<template>
    <div>{{method()}}</div>
</template>

<script lang="ts">
    import { Component } from 'vue-property-decorator';
    import Vue from 'vue';
    import {ITest} from '@/views/test/model';

    @Component
    export default class Test extends Vue implements ITest {
        public method(): string {
            return 'hello';
        }
    }
</script>

测试.spec.ts:

import 'jest';
import {mount} from '@vue/test-utils';
import {ITest} from '@/views/test/model';
import Test from '@/views/test/Test.vue';

describe('Test.vue', () => {
    let wrapper: any;

    beforeEach(() => {
        wrapper = mount(Test);
    });

    test('test method call', () => {
        const test = wrapper.find(Test).vm as ITest;
        expect(test.method()).toEqual('hello');
    });
});

关于typescript - vue 类组件 : TS2339 when calling class method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56457527/

相关文章:

javascript - JS,Vue : how to split text based on window height?

angular - 使 Electron 应用程序允许从本地文件系统下载pdf文件

typescript - 如何在 vuex 存储 typescript 中动态设置对象的属性(同时保持类型安全)

typescript - 使通用类型 Array<keyof T> 需要 T 的所有键

vue.js - 当 VueJS 计算属性返回 HTML 代码时如何处理?

服务器上的 Vue.js 空白页面但在本地主机上没问题

javascript - Vue.js 在组件之间传递数据

node.js - Typescript 2.2 Express req, res implicitly any

vue.js - 使用 RouterLinkStub 进行 Vue 快照测试不会按预期呈现 anchor

css - 如何使溢出元素不增加 flexbox 的高度?