TypeError: Nilai perluasan kelas yang tidak terdefinisi bukan fungsi atau null

Saya mendapatkan kesalahan berikut ini ketika mencoba membuat entitas ini.

TypeError: Nilai perluasan kelas yang tidak terdefinisi bukan fungsi atau null

Saya mengasumsikan ini ada hubungannya dengan ketergantungan sirkuler, tetapi bagaimana hal itu seharusnya dihindari ketika menggunakan pewarisan tabel dan hubungan satu ke banyak?

Ia mengeluh tentang javascript berikut di BaseComic_1.BaseComic.

`let Variant = class Variant extends BaseComic_1.BaseComic {

Berikut ini adalah file lengkapnya.

"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;
}
Larutan

Saya mengalami masalah yang sama. Ternyata saya mengimpor kelas secara sirkuler, yang tampaknya merupakan batasan. (Lihat masalah GitHub ini: #20361, #4149, #10712)

Perhatikan bahwa tampaknya referensi melingkar juga terbatas di antara file-file, bukan hanya tipe.

Lihat ini jawaban lainnya

Komentar (7)

Seperti yang disebutkan dalam komentar Thomas Jensen di atas, referensi melingkar dapat terjadi tidak hanya di Tipe, tetapi juga di file. Saya menemukan masalah yang sama ketika saya mengekspor tipe dasar dan turunan dari file yang sama. Seperti:

// index.ts
export { BaseClass } dari "./base";
export { DerivedClass } dari "./derived";

Ini adalah jebakan yang mudah jatuh ke dalam. Memposting ini di sini dengan harapan akan menghemat waktu debugging orang lain.

Komentar (2)

Baru saja mengalami masalah ini dan, yah, ini aneh. Saya menjalankan proyek sebagai

node --require ts-node/register path/to/index.ts

Dan ini gagal dengan kesalahan di atas bahkan setelah saya menghapus referensi melingkar seperti yang disarankan oleh jawaban yang diterima.

Namun, jika saya menjalankan tsc, kompilasi itu baik-baik saja dan kemudian berjalan dengan baik bahkan dengan --require ts-node/register....

Semoga ini membantu seseorang.

Komentar (0)