尝试创建这些实体时出现以下错误。
TypeError: Class extends value undefined is not a function or null
我假设这与循环依赖有关,但是在使用表继承和一对多关系时应该如何避免这种情况?
它在BaseComic_1.BaseComic
抱怨以下javascript。
let Variant = class Variant extends BaseComic_1.BaseComic {
这是完整的文件。
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
const typeorm_1 = require("typeorm");
const Comic_1 = require("./Comic");
const BaseComic_1 = require("./BaseComic");
let Variant = class Variant extends BaseComic_1.BaseComic {
};
__decorate([
typeorm_1.ManyToOne(type => Comic_1.Comic, comic => comic.variants),
__metadata("design:type", Comic_1.Comic)
], Variant.prototype, "comic", void 0);
Variant = __decorate([
typeorm_1.ClassEntityChild()
], Variant);
exports.Variant = Variant;
//# sourceMappingURL=Variant.js.map
import {Entity, Column, PrimaryGeneratedColumn, OneToMany} from "typeorm";
import {Comic} from "./Comic";
@Entity()
export class Series {
@PrimaryGeneratedColumn()
public id: number;
@Column("text", {
length: 30
})
public copyright: string;
@Column("text", {
length: 100
})
public attributionText: string;
@Column("text", {
length: 150
})
public attributionHTML: string;
@Column("text", {
length: 50
})
public etag: string;
@Column("text", {
length: 200
})
public title: string;
@Column("text")
public description: string;
@Column("number", {
length: 4
})
public startYear: number;
@Column("number", {
length: 4
})
public endYear: number;
@Column("text", {
length: 20
})
public rating: string;
@Column("text", {
length: 20
})
public type: string;
@Column("text")
public thumbnail: string;
@OneToMany(type => Comic, comic => comic.series)
public comics: Array<Comic>;
}
import {Entity, TableInheritance, PrimaryGeneratedColumn, Column, ManyToOne, DiscriminatorColumn} from "typeorm";
import {Series} from "./Series";
@Entity()
@TableInheritance("class-table")
@DiscriminatorColumn({ name: "type", type: "string"})
export class BaseComic {
@PrimaryGeneratedColumn()
public id: number;
@Column("text", {
length: 30
})
public copyright: string;
@Column("text", {
length: 100
})
public attributionText: string;
@Column("text", {
length: 150
})
public attributionHTML: string;
@Column("text", {
length: 50
})
public etag: string;
@Column("text", {
length: 200
})
public title: string;
@Column("int")
public issue: number;
@Column("text")
public variantDescription: string;
@Column("boolean")
public variant: boolean;
@Column("text")
public description: string;
@Column("int")
public pageCount: number;
@Column("date")
public onSaleDate: Date;
@Column("date")
public unlimitedDate: Date;
@Column("text")
public thumbnail: string;
@ManyToOne(type => Series, series => series.comics)
public series: Series;
}
import {OneToMany, ClassEntityChild} from "typeorm";
import {Variant} from "./Variant";
import {BaseComic} from "./BaseComic";
@ClassEntityChild()
export class Comic extends BaseComic {
@OneToMany(type => Variant, variant => variant.comic)
public variants: Variant[];
}
import {ManyToOne, ClassEntityChild} from "typeorm";
import {Comic} from "./Comic";
import {BaseComic} from "./BaseComic";
@ClassEntityChild()
export class Variant extends BaseComic {
@ManyToOne(type => Comic, comic => comic.variants)
public comic: Comic;
}
答案 0 :(得分:50)
我遇到了同样的问题。事实证明我是循环导入类,这显然是一个限制。 (请参阅以下GitHub问题:#20361,#4149,#10712)
请注意,循环引用似乎也限制在文件之间,而不仅仅是类型。
请参阅this其他答案
答案 1 :(得分:2)
只是遇到了这个问题,这很奇怪。我将项目运行为
node --require ts-node/register path/to/index.ts
即使我按照已接受的答案建议删除了循环引用,此操作仍然失败,并出现上述错误。
但是,如果我运行tsc
,它可以正常编译,然后即使使用--require ts-node/register...
,它也可以正常运行。
希望这对某人有帮助。
答案 2 :(得分:2)
识别循环依赖性可能很棘手。 Michael Weststrate有一个关于循环依赖的interesting reading,并提出了一种解决它们的模式。
自动循环依赖检测。
除了使用允许扩展的模式之外,您还可以使用一种超级有用的工具,只需花费很少的精力即可为您识别循环依赖项Madge。
Madge可以在.ts
或.js
文件上运行。我发现在两个目录中运行它很有用,因为由于编译过程它们可能会产生不同的结果。
对于.js文件:
madge --circular --extensions ts
对于.ts文件: madge --circular <目录路径>
答案 3 :(得分:0)
正如上面的Thomas Jensen的评论所指出的,循环引用不仅可以在类型中发生,而且可以在文件中发生。 当我从同一文件导出基本类型和派生类型时,我遇到了同样的问题。如:
Redis
这是一个容易犯的陷阱。将其发布在这里,希望可以节省其他人的调试时间。
答案 4 :(得分:0)
我来到这里是因为当开玩笑地执行代码时,它引发了此错误。
这是因为在为moduleNameMapper
编写jest.config.js
时,对象中元素的顺序至关重要。
有一个帮助程序,它从ts-config.json
导入模块名称:
// jest.config.js
const { pathsToModuleNameMapper } = require('ts-jest/utils');
// In the following statement, replace `./tsconfig` with the path to your `tsconfig` file
// which contains the path mapping (ie the `compilerOptions.paths` option):
const { compilerOptions } = require('./tsconfig');
module.exports = {
// [...]
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths /*, { prefix: '<rootDir>/' } */ )
};
答案 5 :(得分:0)
我遇到了同样的问题,因为我的编辑器从错误的软件包中自动导入了Entity
。
一旦我将import { Entity } from 'typeorm/decorator/entity/Entity';
改回import { Entity } from 'typeorm';
,错误消息就会消失。
答案 6 :(得分:-1)
内部模块模式
试试这个例子来解决循环依赖。 您可以找到的详细信息Here
// -- app.js --
import { AbstractNode } from './internal'
/* as is */
// -- internal.js --
export * from './AbstractNode'
export * from './Node'
export * from './Leaf'
// -- AbstractNode.js --
import { Node, Leaf } from './internal'
export class AbstractNode {
/* as is */
}
// -- Node.js --
import { AbstractNode } from './internal'
export class Node extends AbstractNode {
/* as is */
}
// -- Leaf.js --
import { AbstractNode } from './internal'
export class Leaf extends AbstractNode {
/* as is */
}