web-dev-qa-db-fra.com

TypeError: La classe étend la valeur undefined n'est pas une fonction ou null

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;
}
30
prolink007

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

57
Joshua King

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.

3
ajxs

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.

0
PeS