Vue + typescript - TypeError:对象原型可能只是一个对象或空:未定义

Posted

技术标签:

【中文标题】Vue + typescript - TypeError:对象原型可能只是一个对象或空:未定义【英文标题】:Vue + typescript - TypeError: Object prototype may only be an Object or null: undefined 【发布时间】:2018-08-06 03:10:26 【问题描述】:

TypeError: Object 原型可能只是一个 Object 或 null: undefined

我的项目出现了一些错误。 我正在使用 vuejs、typescript 和 jest。

这只是简单的代码,我尝试用 jest 进行单元测试,但它有一些错误。这是我的测试代码。

///<reference path="../../../../node_modules/@types/jest/index.d.ts"/>
// https://vue-test-utils.vuejs.org/kr/s
import  mount  from "vue-test-utils";
import HelloWorld from './HelloWorld.vue';

describe('[HelloWorld]', function () 
  let cmp: any;

  beforeEach(() => 
    cmp = mount(HelloWorld);
  );

  it("Check vue instance", () => 
    expect(cmp.isVueInstance()).toBeTruthy();
  );

  it("message is Hello", () => 
    expect(cmp.vm.msg).toEqual('Hello!!');
  );
);

这是vue文件

   <template>
   <div class="hello">
       <h1> msg </h1>
       <img src="/assets/logo.png">
       <button @click="clickHandler">
         button
       </button>
     </div>
   </template>

   <script lang="ts">
   import Vue from "vue";
   import Component from "vue-class-component";

   interface HelloWorldInterface 
     msg: string;
     clickHandler(): void;
   

   @Component()
   export default class HelloWorld extends Vue implements HelloWorldInterface 
     msg = "Hello!!";
     clickHandler() 
       window.alert(this.msg);
     
   
   </script>

Here is error logs with picture.

【问题讨论】:

我也有同样的问题TypeError: Object prototype may only be an Object or null: undefined at setPrototypeOf (&lt;anonymous&gt;) 显然这是解决模块时一些循环引用的问题。如果您找到解决方案,请随时通知我。 【参考方案1】:

你应该为你的tsconfig.json 设置esModuleInterop = true 或者你自己的tsconfig 只是为了jest

【讨论】:

【参考方案2】:

问题似乎是Vue2如何暴露自己,所以import Vue from "vue"导致了这个错误。

我通过像这样使用“vue-property-decorator”来修复它:

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

那么“vue-property-decorator”是做什么的?它导入然后导出 Vue 不是默认的,而是命名为 export。如果你愿意,我想你可以在自己的代码中做到这一点。

import Vue,  PropOptions, WatchOptions  from 'vue';
...
export  Component, Vue, mixins as Mixins ;

【讨论】:

【参考方案3】:

对我来说,使用 import * as Vue from "vue" 而不是 import Vue from "vue" 解决了我的项目的问题,我的项目具有类似的设置,即:

//import Vue from "vue";
import * as Vue from "vue";
import Component from "vue-class-component";

interface HelloWorldInterface 
  msg: string;
  clickHandler(): void;


@Component
export default class HelloWorld extends Vue implements HelloWorldInterface 
  msg = "Hello!!";
  clickHandler() 
    window.alert(this.msg);
  

它要麻烦得多,但至少它有效。我已经使用 vue-cli 设置了一个概念验证示例:https://codesandbox.io/s/mjvjw2xw39

【讨论】:

【参考方案4】:

没有

 it("message is Hello", () => 
    expect(cmp.vm.msg).toEqual('Hello!!');
  );

应该是

it("message is Hello", () => 
    expect(cmp.msg).toEqual('Hello!!');
  );

【讨论】:

【参考方案5】:

我通过从标签中删除 lang="ts" 解决了这个问题

【讨论】:

【参考方案6】:

查看下面的此链接,它确实帮助我解决了该命令的循环依赖问题 npx madge --circular --extensions ts ./

链接: To Detect Circular Dependency in you package

尽管如此,我仍然收到错误..!! :(

【讨论】:

以上是关于Vue + typescript - TypeError:对象原型可能只是一个对象或空:未定义的主要内容,如果未能解决你的问题,请参考以下文章

Vue / Typescript,得到模块'“*.vue”'没有导出成员

uniapp+vue3 接入typescript

vite + vue3 添加 typescript

Vue/TypeScript/Linting 排除 .vue 文件

在vue项目中写Typescript

Vue + Typescript - 无效类型