Je reçois l'erreur suivante lorsque j'essaie de créer ces entités.
TypeError: Class extends value undefined is not a function or null
Je suppose que cela a quelque chose à voir avec les dépendances circulaires, mais comment cela est-il censé être évité lors de l'utilisation de l'héritage de table et des relations un à plusieurs?
Il se plaint du javascript suivant sur BaseComic_1.BaseComic
.
let Variant = class Variant extends BaseComic_1.BaseComic {
Voici le fichier complet.
"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;
}
J'avais le même problème. Il se trouve que j'importais des classes de manière circulaire, ce qui est apparemment une limitation. (Voir ces problèmes GitHub: # 20361 , # 4149 , # 10712 )
Notez qu'il semble que la référence circulaire est également limitée entre les fichiers, pas simplement les types.
Voir ceci autre réponse
Comme indiqué dans le commentaire de Thomas Jensen ci-dessus, les références circulaires peuvent apparaître non seulement dans les types, mais également dans les fichiers. J'ai rencontré ce même problème lorsque j'exportais à la fois les types de base et dérivés à partir du même fichier. Tel que:
// index.ts
export { BaseClass } from "./base";
export { DerivedClass } from "./derived";
C'est un piège facile à tomber. Publier ceci ici dans l’espoir d’économiser du temps de débogage à quelqu'un d’autre.
J'ai juste rencontré ce problème et, eh bien, c'est étrange. Je dirige le projet en tant que
node --require ts-node/register path/to/index.ts
Et cela a échoué avec l'erreur ci-dessus même après avoir supprimé les références circulaires comme suggéré par la réponse acceptée.
Cependant, si j’exécute tsc
cela compile bien, puis ça fonctionne même avec --require ts-node/register...
.
J'espère que ça aide quelqu'un.