问题
我得到一个循环加载程序异常。这可能是编译器选项造成的"emitDecoratorMetadata":true
。我该如何解决?感谢您提供有用的回放!
介绍
我已经准备了一个最小的项目来重现错误。请查看我的临时 git 存储库:git repo for bug presentation
我使用两个库(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
是否未定义,但测试会提前中断,因为如果传递的属性(在本例中为 type )库json2typescript
会引发异常。Banana
undefined
奇怪的行为是,如果我将类分配Ape
给一个变量(删除第 6 行的注释),那么类型/类Banana
就被定义了。