Object prototype may only be an object or null wink ошибка как исправить

TypeError: Object prototype may only be an Object or null: undefined I got some error in my project. I'm using vuejs, typescript and jest. It's just simple code and I tried to unit test with je...

TypeError: Object prototype may only be an Object or null: undefined

I got some error in my project.
I’m using vuejs, typescript and jest.

It’s just simple code and I tried to unit test with jest, but It have some error. Here is my test code.

///<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!!');
  });
});

and Here is vue file

   <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.

asked Feb 26, 2018 at 15:55

Younghoon Kim's user avatar

1

You should set esModuleInterop = true for your tsconfig.json or your own tsconfig just for jest

answered Jul 20, 2018 at 11:46

Hoang Vu's user avatar

Hoang VuHoang Vu

811 silver badge4 bronze badges

The problem seems to be how Vue2 exposes itself, so import Vue from "vue" causes this error.

I fixed it by using ‘vue-property-decorator’ like this:

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

So what does ‘vue-property-decorator’ do? It imports and then exports Vue not as default but named export. I guess you could do that in your own code, if you wanted.

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

answered Apr 9, 2020 at 7:32

Reynicke's user avatar

ReynickeReynicke

1,3051 gold badge10 silver badges20 bronze badges

For me, using import * as Vue from "vue" instead of import Vue from "vue" fixed the problem for my projects with a similar setup, i.e.:

//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);
  }
}

It is a lot more cumbersome, but at least it works. I have setup a proof-of-concept example using vue-cli: https://codesandbox.io/s/mjvjw2xw39

Bassie's user avatar

Bassie

9,0227 gold badges59 silver badges138 bronze badges

answered Apr 5, 2018 at 7:19

Terry's user avatar

TerryTerry

61.4k15 gold badges90 silver badges114 bronze badges

Not

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

Should be

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

answered Feb 26, 2018 at 16:11

аlex dykyі's user avatar

аlex dykyіаlex dykyі

5,3111 gold badge28 silver badges38 bronze badges

I solved the problem by removing lang=»ts» from tag

answered Mar 31, 2020 at 8:02

Александр Братко's user avatar

Checkout this link below, it really helped me resolve CIRCULAR DEPENDENCY issue with the command
npx madge --circular --extensions ts ./

Link:
To Detect Circular Dependency in you package

Neverthless I’m still getting the Error..!! :(

answered Aug 10, 2020 at 11:36

B. K.'s user avatar

B. K.B. K.

536 bronze badges

TypeError: Object prototype may only be an Object or null: undefined

I got some error in my project.
I’m using vuejs, typescript and jest.

It’s just simple code and I tried to unit test with jest, but It have some error. Here is my test code.

///<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!!');
  });
});

and Here is vue file

   <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.

asked Feb 26, 2018 at 15:55

Younghoon Kim's user avatar

1

You should set esModuleInterop = true for your tsconfig.json or your own tsconfig just for jest

answered Jul 20, 2018 at 11:46

Hoang Vu's user avatar

Hoang VuHoang Vu

811 silver badge4 bronze badges

The problem seems to be how Vue2 exposes itself, so import Vue from "vue" causes this error.

I fixed it by using ‘vue-property-decorator’ like this:

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

So what does ‘vue-property-decorator’ do? It imports and then exports Vue not as default but named export. I guess you could do that in your own code, if you wanted.

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

answered Apr 9, 2020 at 7:32

Reynicke's user avatar

ReynickeReynicke

1,3051 gold badge10 silver badges20 bronze badges

For me, using import * as Vue from "vue" instead of import Vue from "vue" fixed the problem for my projects with a similar setup, i.e.:

//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);
  }
}

It is a lot more cumbersome, but at least it works. I have setup a proof-of-concept example using vue-cli: https://codesandbox.io/s/mjvjw2xw39

Bassie's user avatar

Bassie

9,0227 gold badges59 silver badges138 bronze badges

answered Apr 5, 2018 at 7:19

Terry's user avatar

TerryTerry

61.4k15 gold badges90 silver badges114 bronze badges

Not

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

Should be

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

answered Feb 26, 2018 at 16:11

аlex dykyі's user avatar

аlex dykyіаlex dykyі

5,3111 gold badge28 silver badges38 bronze badges

I solved the problem by removing lang=»ts» from tag

answered Mar 31, 2020 at 8:02

Александр Братко's user avatar

Checkout this link below, it really helped me resolve CIRCULAR DEPENDENCY issue with the command
npx madge --circular --extensions ts ./

Link:
To Detect Circular Dependency in you package

Neverthless I’m still getting the Error..!! :(

answered Aug 10, 2020 at 11:36

B. K.'s user avatar

B. K.B. K.

536 bronze badges

@Hunta
I just create a blank new project with media native plugin.
when I run «npm install @angular/cli@8.3.12», I got your same error message when build a production file.
when I run «npm install @angular/cli@5.2.11», build error gone but mp3 fail to play.

here is my package.json:

{
«name»: «myApp»,
«version»: «0.0.1»,
«author»: «Ionic Framework»,
«homepage»: «http://ionicframework.com/»,
«private»: true,
«scripts»: {
«start»: «ionic-app-scripts serve»,
«clean»: «ionic-app-scripts clean»,
«build»: «ionic-app-scripts build»,
«lint»: «ionic-app-scripts lint»
},
«dependencies»: {
«@angular/animations»: «5.2.11»,
«@angular/cli»: «^8.3.12»,
«@angular/common»: «5.2.11»,
«@angular/compiler»: «5.2.11»,
«@angular/compiler-cli»: «^8.2.11»,
«@angular/core»: «5.2.11»,
«@angular/forms»: «5.2.11»,
«@angular/http»: «5.2.11»,
«@angular/platform-browser»: «5.2.11»,
«@angular/platform-browser-dynamic»: «5.2.11»,
«@ionic-native/core»: «~4.20.0»,
«@ionic-native/media»: «^4.20.0»,
«@ionic-native/splash-screen»: «~4.20.0»,
«@ionic-native/status-bar»: «~4.20.0»,
«@ionic/storage»: «2.2.0»,
«cordova-android»: «^8.1.0»,
«cordova-plugin-device»: «^2.0.2»,
«cordova-plugin-file»: «^6.0.2»,
«cordova-plugin-ionic-keyboard»: «^2.2.0»,
«cordova-plugin-ionic-webview»: «^4.1.2»,
«cordova-plugin-media»: «^5.0.3»,
«cordova-plugin-splashscreen»: «^5.0.2»,
«cordova-plugin-statusbar»: «^2.4.2»,
«cordova-plugin-whitelist»: «^1.3.3»,
«cordova-res»: «^0.8.0»,
«ionic-angular»: «3.9.5»,
«ionicons»: «3.0.0»,
«rxjs»: «5.5.11»,
«sharp»: «^0.23.1»,
«sw-toolbox»: «3.6.0»,
«zone.js»: «0.8.29»
},
«devDependencies»: {
«@ionic/app-scripts»: «3.2.2»,
«typescript»: «~2.6.2»
},
«description»: «An Ionic project»,
«cordova»: {
«plugins»: {
«cordova-plugin-media»: {},
«cordova-plugin-whitelist»: {},
«cordova-plugin-statusbar»: {},
«cordova-plugin-device»: {},
«cordova-plugin-splashscreen»: {},
«cordova-plugin-ionic-webview»: {
«ANDROID_SUPPORT_ANNOTATIONS_VERSION»: «27.+»
},
«cordova-plugin-ionic-keyboard»: {}
},
«platforms»: [
«android»
]
}
}

#javascript #node.js #es6-modules #vite #filestack

Вопрос:

Я использую filestack-js в проекте Rails, который поставляется в комплекте с Vite. Все работает так, как ожидалось, пока я не включу модуль ESM для filestack-js библиотеки, в данном случае в контроллер StimulusJS:

 import { Controller } from "stimulus";

import * as filestack from "filestack-js";

export default class extends Controller {
  // some irrelevant implementation code that calls filestack.init(...)
}
 

Загрузка вышеуказанного файла контроллера в браузере вызывает ошибку:

 tslib.es6.js:25 Uncaught TypeError: Object prototype may only be an Object or null: undefined
    at setPrototypeOf (<anonymous>)
    at __extends (tslib.es6.js:25)
    at http.ts:43
    at node_modules/filestack-js/build/module/lib/request/adapters/http.js (http.ts:64)
    at __init (chunk-IHTDASF6.js?v=1616a449:14)
    at request_adapter.node.ts:17
 

Это ошибка, вызванная браузером при работе в среде разработки, при использовании Vite для создания и обслуживания модулей ES непосредственно в браузере. Он обрабатывает компиляцию машинописного текста. Удаление import * as filestack бита устраняет ошибку (но, очевидно, нарушает функциональность класса).

Мои поиски в Google, похоже, предполагают, что это может быть проблемой циклической зависимости. Трассировка стека браузера указывает на файл в filestack-js библиотеке:

 // src/lib/request/adapters/http.ts

import * as url from 'url';
import * as zlib from 'zlib';
import Debug from 'debug';

import { AdapterInterface } from './interface';
import { getVersion } from '../../utils';
import * as Stream from 'stream'; // <---------- Stream imported here
import { FsRequestOptions, FsResponse } from '../types';
import * as utils from '../utils';
import { prepareData, parseResponse, combineURL, set as setHeader, normalizeHeaders } from './../helpers';
import { FsRequestErrorCode, FsRequestError } from '../error';
import { FsHttpMethod } from './../types';

const HTTPS_REGEXP = /https:?/;
const HTTP_CHUNK_SIZE = 16 * 1024;
const MAX_REDIRECTS = 10;
const CANCEL_CLEAR = `FsCleanMemory`;
const debug = Debug('fs:request:http');

class HttpWritableStream extends Stream.Writable {
  // omitted class definition
}
 

Где Stream.Writable на самом деле не определено из-за проблемы циклической зависимости. Я понятия не имею, как это могло произойти или, похоже, повлияло только на меня.

Это не проблема, о которой сообщалось в отслеживателе проблем filestack-js.

Отладка в браузере и локальное клонирование/связывание репозитория подтвердили , что Stream.Writable это возвращается undefined , но я недостаточно знаю о JS, чтобы понять, почему. Предположительно, это обычно происходит из-за циклической зависимости, но я не уверен, как модуль nodejs Stream будет иметь циклические зависимости от случайной библиотеки, например filestack-js . Я также достаточно неопытен в мире JS, чтобы точно понять, что значит использовать библиотеку NodeJS, как Stream в модуле браузера, — filestack-js в ней есть как браузерные модули, так и модули CommonJS/NodeJS, поэтому я не уверен, как/связаны ли они или взаимодействуют.

Вот как Stream выглядит объект при входе в консоль браузера. Очевидно, что что-то было импортировано, но Writable не является свойством того, что было импортировано:

консоль браузера

FWIW это происходит в Chrome и Firefox, последних версиях каждого из них.

Я также попытался использовать dpdm для анализа проекта filestack-js на наличие циклических зависимостей. Он нашел некоторые, но не похоже, что они вызывают ошибки, и, похоже, явно исключаются библиотеки узлов и другие библиотеки зависимостей.

Комментарии:

1. Хорошо, я вижу, что это может быть связано с тем фактом, что Vite использует накопительный пакет под капотом, и этот накопительный пакет может не справляться с определенными циклическими зависимостями, существующими в библиотеках NodeJS? это репозиторий существует, и кажется, что он может быть разработан для решения такого рода проблем, но, похоже, он не работает для меня.

2. Действительно ли этот стимул и ваш собственный класс необходимы для того, чтобы вызвать проблему, или это уже происходит, если все, что вы делаете, — это импортируете filestack-js библиотеку?

3. @Bergi Я могу подтвердить, что это не имеет отношения к делу. Просто так получилось, что я пользуюсь библиотекой именно там. Извини, что я не ясно выразился.

4. В этом случае я бы определенно сообщил об этом как об ошибке в их системе отслеживания проблем. Тем более, что документация утверждает, что работает с накопительным пакетом из коробки. Однако вам следует поделиться своей конфигурацией свертки

5. Ого, я пропустил эту ссылку на свертку. До сих пор я не решался опубликовать проблему, потому что у меня нет простого решения, но, думаю, я мог бы придумать более простое. Спасибо.

Ответ №1:

Хорошо, я думаю, что решил свою проблему, но я не эксперт, поэтому я попытаюсь объяснить, в чем была проблема. Не стесняйтесь вступать в разговор с разъяснениями, если вам лучше известно.

Это было вызвано filestack-js интенсивным использованием библиотек nodejs. Исторически сложилось так, что Webpack v4 заполнил множество распространенных библиотек NodeJS для использования в браузере, полностью прозрачных для большинства разработчиков. Это прекрасно работало, но было полным волшебством.

Накопительный пакет и, кстати, Webpack v5 не выполняют этого заполнения, поэтому любые библиотеки NodeJS, используемые библиотеками «ESM» из NPM, которые напрямую не совместимы с современными браузерами, просто сломаются. Чтобы заполнить это вручную, мне пришлось поручить Vite amp; Rollup присвоить псевдоним имени модуля nodejs stream чему-то, что напрямую совместимо с браузерами, и установить его. Чтобы сделать это, я:

 yarn add --dev stream-browserify
 

И добавил следующее к моему vite.config.js :

 // ...
resolve: {
  alias: {
    stream: "stream-browserify",
  },
},
// ...
 

Должен быть очень похожий (но другой) способ сообщить свертке, чтобы сделать это, потому что здесь я делаю это через конфигурацию Vite.

Для дополнительного контекста вот проблема GitHub, которую я открыл в filestack-js репо: https://github.com/filestack/filestack-js/issues/458

Ответ №2:

Привет, я только начал с TypeScript, и я попытался скопировать javascript в TypeScript и изменил материал, чтобы он был более объектно-ориентированным. Теперь я пытаюсь запустить его с помощью cmd и команды ns-node.

private username:string;
           ^
TypeError: Object prototype may only be an Object or null: undefined

Эта ошибка не имеет никакого смысла, поэтому я погуглил и увидел, что проблема может заключаться в импорте проекта. Я перепробовал каждую душу на разных сайтах, и они не помогли.

Итак, мой код:

import { Entity } from './Entity';
import { Bullet } from './Bullet';

import * as fs from "fs";
export class Player extends Entity{

private username:string;
protected pressingRight:boolean ;
protected pressingLeft:boolean ;
...
}

Так в чем может быть проблема? Тебе за твою помощь

РЕДАКТИРОВАТЬ:

    import {Point} from "./Point";
    import {Bullet} from "./Bullet";
import {Player} from "./Player";
export class Entity{

protected x:number;
protected y:number;
protected spdX:number = 0;
protected spdY:number = 0;
protected id:number;
protected map:string;


protected static initPack = {player:[],bullet:[]};
protected static removePack = {player:[],bullet:[]};

 constructor(x:number,y:number,id:number,map:string){
    this.x = x;
    this.y=y;
    this.id=id;
    this.map=map;
 }
...}

И Bullet.ts:

    import {Entity} from './Entity';
import {Player} from './Player';
export class Bullet extends Entity{

private angle:number;
private parentID:number;
private timer:number = 0;
private toRemove:boolean=false;

public static list={};

constructor(x:number,y:number,map:string,parentId:number,angle:number,id:number){
    super(x,y,id,map);
    this.angle = angle;
    this.spdX= Math.cos(angle/180*Math.PI) * 10;
    this.spdY= Math.sin(angle/180*Math.PI) * 10;
    this.parentID = parentId;

    Bullet.list[this.id] = self;
    Bullet.initPack.bullet.push(this.getInitPack());
}

1 ответ

Лучший ответ

У вас циклический импорт. В зависимости от того, с какого файла вы начинаете, когда ts-node достигает импорта файла, который уже находится в процессе загрузки, он продолжит этот импорт, даже если загрузка импортированного файла не завершена. Вот как можно обойти import { Entity } from './Entity';, а Entity все еще может быть неопределенным.

Если Entity.ts не требуется доступ к классу Player во время загрузки файла, попробуйте переместить строку import { Player } from './Player'; в конец Entity.ts.


6

Matt McCutchen
11 Авг 2018 в 23:48

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Object of type int has no len python ошибка
  • Object is of type unknown error
  • Object is not subscriptable python error
  • Object htmlparagraphelement js как исправить
  • Object has non uniform scale blender как исправить

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии