Вопрос
Я получаю исключение для кругового загрузчика. Это может быть вызвано параметром компилятора "emitDecoratorMetadata":true
.
Как я могу это исправить? Спасибо за полезные повторы!
Введение
Я подготовил минимальный проект для воспроизведения ошибки. Пожалуйста, взгляните на мой временный git-репозиторий: git-репозиторий для представления ошибок
Я использую две библиотеки (typeorm
и json2typescript
), и обе работают с декораторами. Я использую несколько декораторов из обеих библиотек для некоторых свойств класса.
Шаги для воспроизведения:
- Клонируйте репозиторий git.
- Установить все пакеты командой
npm i
(npm 6.9.0).
- Откройте корневой каталог с помощью
Visual Studio Code
.
- Откройте
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
.