Beim Versuch, diese Entitäten zu erstellen, wird die folgende Fehlermeldung angezeigt.
TypeError: Class extends value undefined is not a function or null
Ich gehe davon aus, dass dies etwas mit zirkulären Abhängigkeiten zu tun hat, aber wie soll dies vermieden werden, wenn Tabellenvererbung und eine bis viele Beziehungen verwendet werden?
Es beschwert sich über das folgende Javascript bei BaseComic_1.BaseComic
.
let Variant = class Variant extends BaseComic_1.BaseComic {
Hier ist die komplette Datei.
"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;
}
quelle
Wie im obigen Kommentar von Thomas Jensen erwähnt, können Zirkelverweise nicht nur in Typen, sondern auch in Dateien vorkommen. Ich habe dasselbe Problem festgestellt, als ich sowohl den Basis- als auch den abgeleiteten Typ aus derselben Datei exportiert habe. Sowie:
// index.ts export { BaseClass } from "./base"; export { DerivedClass } from "./derived";
Dies ist eine leichte Falle, in die man fallen kann. Wenn Sie dies hier veröffentlichen, in der Hoffnung, dass dies jemand anderem die Debugging-Zeit erspart.
quelle
index.ts
Dateien ein Anti-Muster sind, ich weiß, dass einige Leute damit nicht einverstanden sind. Ich denke, sie sind eine großartige Möglichkeit, eine nützliche öffentliche Schnittstelle zu einem Modul bereitzustellen. Aus dem Speicher heraus habe ich dieses Problem durch Refactoring behoben, sodass die Basisklasse überhaupt nicht exportiert werden muss. Leider kann ich Ihnen keine bessere Antwort geben.Ich bin gerade auf dieses Problem gestoßen und es ist seltsam. Ich leite das Projekt als
node --require ts-node/register path/to/index.ts
Und dies schlug mit dem obigen Fehler fehl, selbst nachdem ich Zirkelverweise entfernt hatte, wie durch die akzeptierte Antwort vorgeschlagen.
Wenn ich es jedoch ausführe, wird
tsc
es gut kompiliert und dann läuft es auch mit--require ts-node/register...
.Hoffe das hilft jemandem.
quelle
Zirkuläre Abhängigkeiten können schwierig zu identifizieren sein. Michael Weststrate hat eine interessante Lektüre über zirkuläre Abhängigkeiten und schlug ein Muster vor, um diese zu beheben.
Automatische Erkennung kreisförmiger Abhängigkeiten.
Neben der Verwendung eines Musters, das Skalierbarkeit ermöglicht, können Sie ein äußerst nützliches Tool verwenden, mit dem Sie mit sehr geringem Aufwand zirkuläre Abhängigkeiten identifizieren können, Madge .
Madge kann überfahren werden
.ts
oder.js
Dateien. Ich fand es nützlich, es in beiden Verzeichnissen auszuführen, da sie aufgrund des Transpilationsprozesses unterschiedliche Ergebnisse liefern können.Für .js-Dateien : madge --circular --extensions ts <Verzeichnispfad>
Für .ts-Dateien : madge --circular <Verzeichnispfad>
quelle
Ich bin hierher gekommen, weil beim Ausführen des Codes mit Scherz dieser Fehler aufgetreten ist. Dies liegt daran, dass beim Schreiben der
moduleNameMapper
für diejest.config.js
Reihenfolge der Elemente im Objekt wesentlich ist.Es gibt einen Helfer, der die Modulnamen importiert aus
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>/' } */ ) };
Entnommen aus der offiziellen Dokumentation von ts-jest
quelle
Ich hatte das gleiche Problem, weil mein Editor automatisch
Entity
aus dem falschen Paket importiert wurde .Sobald ich
import { Entity } from 'typeorm/decorator/entity/Entity';
wieder aufimport { Entity } from 'typeorm';
die Fehlermeldung umgestellt habe , verschwand sie.quelle