исключение загрузчика / циклическая ссылка декораторами - PullRequest
0 голосов
/ 14 апреля 2019

Вопрос

Я получаю исключение для кругового загрузчика. Это может быть вызвано параметром компилятора "emitDecoratorMetadata":true. Как я могу это исправить? Спасибо за полезные повторы!

Введение

Я подготовил минимальный проект для воспроизведения ошибки. Пожалуйста, взгляните на мой временный git-репозиторий: git-репозиторий для представления ошибок

Я использую две библиотеки (typeorm и json2typescript), и обе работают с декораторами. Я использую несколько декораторов из обеих библиотек для некоторых свойств класса.

Шаги для воспроизведения:

  1. Клонируйте репозиторий git.
  2. Установить все пакеты командой npm i (npm 6.9.0).
  3. Откройте корневой каталог с помощью Visual Studio Code.
  4. Откройте bugexample/test/test.spec.ts, перейдите в режим отладки и начните отладку с помощью конфигурации Mocha current file.

После этих шагов вы увидите вывод исключения.

/bugexample/node_modules/reflect-metadata/Reflect.js:553
                var decorated = decorator(target, propertyKey, descriptor);
                                ^
Error: Fatal error in JsonConvert. It is not allowed to explicitly pass "undefined" as second parameter in the @JsonProperty decorator.

        Class property: 
                banana

Use "Any" to allow any type. You can import this class from "json2typescript".

Свойство banana получает тип Banana в качестве параметра, и этот тип равен undefined по неизвестным причинам. Библиотека json2typescript не является причиной этой проблемы.


Анализ

Теперь я хочу разбить проблему. Я начинаю с двух модельных классов и заканчиваю тестом.

Сначала посмотрите на bug_presentation/src/persistence/models/ape.model.ts.

import { JsonObject, JsonProperty } from "json2typescript";
import { Column, Entity, OneToOne, PrimaryGeneratedColumn } from "typeorm";

import { Banana } from "./banana.model";

/**
 * This is an entity class.
 * 
 * @author Tim Lehmann <l_@freenet.de>
 */
@JsonObject("Ape")
@Entity()
export class Ape {

  @PrimaryGeneratedColumn()
  readonly id: number

  @JsonProperty('0')
  @Column()
  readonly name: string = null

  // the associated table holds the foreign keys

  @JsonProperty('1', Banana)
  @OneToOne(type => Banana, banana => banana.possessionOf, { cascade: true })
  readonly banana = new Banana();
}

В строке 24 тип Banana является переданным параметром, но по неизвестным причинам это undefined для текущего теста в это время.

Теперь взгляните на bug_presentation/src/persistence/models/banana.model.ts, пожалуйста.

import { JsonObject, JsonProperty } from "json2typescript";
import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from "typeorm";

import { Ape } from "./ape.model";

/**
 * @author Tim Lehmann <l_@freenet.de>
 */
@JsonObject("Banana")
@Entity()
export class Banana {

  @PrimaryGeneratedColumn()
  private readonly id: number

  @JsonProperty('0')
  @Column()
  readonly weight: string = null

  @OneToOne(type => Ape, possessionOf => possessionOf.banana)
  @JoinColumn({ name: "possessionOf" })
  readonly possessionOf: Ape = new Ape();
}

Строки 21 и 22 проблематичны. Если я закомментирую эти строки, то нет никаких исключений загрузчика.

Пожалуйста, взгляните на bug_presentation/test/test.spec.ts, наконец.

import { expect } from "chai";

import { Ape } from "../src/persistence/models/ape.model";
import { Banana } from "../src/persistence/models/banana.model";

// const classApe = Ape;
const classBanana = Banana;

describe("check if class type exist", () => {

  it('check class Ape is defined', () => {
        // expect(classApe).exist;
  })

  it('check class Banana is defined', () => {
    expect(classBanana).exist;
  })
})

Я хочу проверить, что тип / класс Banana не определен, но тест прерывается раньше, потому что библиотека json2typescript выдает исключение, если переданное свойство (в данном случае тип Banana) равно undefined.

Странное поведение состоит в том, что если я назначаю переменную класса Ape (удаляем комментарий в строке 6), то определяется тип / класс Banana.


...