programing

TypeError: 정의되지 않은 클래스 확장 값이 함수 또는 null이 아닙니다.

newstyles 2023. 3. 10. 21:20

TypeError: 정의되지 않은 클래스 확장 값이 함수 또는 null이 아닙니다.

이러한 엔티티를 작성하려고 하면 다음 오류가 발생합니다.

TypeError: Class extends value undefined is not a function or null

이것은 순환 의존성과 관련이 있다고 생각합니다만, 테이블 상속과 일대다 관계를 사용할 때는 어떻게 피할 수 있을까요?

【】【javascript】에서 에 대해 을 제기하고 .BaseComic_1.BaseComic.

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

저도 같은 문제를 겪고 있었어요.저는 순환적으로 수업을 수입하고 있었는데, 그것이 한계인 것 같습니다.(다음 GitHub 문제 참조: #20361, #4149, #10712)

순환 참조도 단순한 형식이 아니라 파일 간에 제한되는 것으로 보입니다.

다른 답변 참조

위의 Thomas Jensen의 코멘트에서 언급한 바와 같이 순환 참조는 유형뿐만 아니라 파일에서도 발생할 수 있습니다.같은 파일에서 base와 derived type을 모두 내보내는 동안 동일한 문제가 발생했습니다.예를 들어 다음과 같습니다.

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

이것은 빠지기 쉬운 함정입니다.다른 사용자가 디버깅 시간을 절약할 수 있도록 여기에 게시합니다.

순환 의존성은 식별하기 어려울 수 있습니다.Michael Weststrate는 순환의존성에 대한 흥미로운 글을 읽고 이를 고치기 위한 패턴을 제안했다.

순환 종속성 자동 감지.

확장성을 실현하는 패턴을 사용하는 것 외에, 매우 편리한 툴을 사용할 수 있습니다. 툴을 사용하면, 매우 간단하게 순환 의존 관계를 특정할 수 있습니다.

매지는 치일 수 있다..ts ★★★★★★★★★★★★★★★★★」.js두 디렉토리에서 모두 실행할 때 유용하다는 것을 알았습니다. 변환 프로세스에 따라 결과가 달라질 수 있기 때문입니다.

Typescript .ts 파일의 경우:

madge --circular --extensions ts <directory_path>

Javascript .js 파일의 경우:

madge --circular <directory_path>

농담으로 코드를 실행하면 이 오류가 발생했기 때문에 왔습니다.요, 이 쓸 때moduleNameMapper★★★★★★★★★★★★★★★★의 경우jest.config.js이치노

Import에서 이름을 .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>/' } */ )
};

ts-jest의 공식 문서에서 인용했습니다.

방금 이 문제에 부딪혔는데, 음, 이상해요.저는 프로젝트를 진행하고 있습니다.

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

그리고 이것은 수용된 답변에 의해 제시된 순환 참조를 삭제한 후에도 위의 오류로 인해 실패했습니다.

하지만 만약 내가 뛰면tsc컴파일이 잘 되고, 그 다음에도 정상적으로 동작합니다.--require ts-node/register....

이게 도움이 됐으면 좋겠네요.

나는 순환 의존이 아니었다.Angular 웹 앱용입니다.

추상 수업을 들었어요.

export abstract class BaseService {
  ...
}

Angular 서비스를 구현하기 위해 확장하려고 했습니다.

@Injectable({
  providedIn: 'root'
})
export class MyExtendedService extends BaseService {

근데 계속 오류가 나요.TypeError: Class extends value undefined is not a function or null내 안에서app.module.ts이 확장 기능을 구현하고 있었습니다.

많은 시행착오를 겪은 후, 나는 내가 더해야 한다는 것을 알게 되었다.@Injectable기본 클래스에도 적용됩니다.그래서 기본 클래스를 다음과 같이 업데이트했습니다.

@Injectable()
export abstract class BaseService {
  ...
}

모든 게 잘 풀렸어요

저도 같은 실수를 했어요.

그 이유는 나의index.vue단일 파일 컴포넌트가 Import된index.ts공통 로직이 포함된 파일:

// index.vue

import Impl from './index'

파일 구조는 다음과 같습니다.

/my-component
  index.vue
  index.ts

제가 알기로는index.vue자체 Import.그래서 그냥 이름을 바꿨어요index.ts로.common.ts.

저도 같은 문제가 있었습니다. 왜냐하면 제 편집자가Entity잘못된 포장에서 꺼냅니다.

내가 변했을 때import { Entity } from 'typeorm/decorator/entity/Entity';로 되돌아가다.import { Entity } from 'typeorm';에러 메세지가 사라졌습니다.

내부 모듈 패턴

순환 종속성을 해결하기 위해 이 예를 사용해 보십시오. 자세한 내용은 여기에서 찾을 수 있습니다.

// -- 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 */
}

노드 타입 스크립트프로젝트에서는 Import/export 구문을 사용하고 있었습니다(요구 초과).

module.exports 구문을 삭제하는 것을 잊어버린 파일에서 다음 오류가 발생했습니다.

module.exports = { AbstractClass } // this will cause issues if you use import/export syntax

그냥 삭제하고 '내보내기' 키워드를 사용하면 됐다.

export class AbstractClass { /* stuff */ }

1. 리액트 컴포넌트 설계:

class Card extends React.Compoonent {

오타를 참조해 주세요.컴푸넌트

2. Windows에서 Angular 설치가 실패하고 다음 오류가 발생함:

TypeError: 정의되지 않은 클래스 확장 값이 함수 또는 null이 아닙니다.

  1. Start > Run > AppWiz.cpl > Uninstall node.js

  2. 노드 설치 디렉토리를 삭제하여 나머지 폴더 및 파일을 삭제합니다.

  3. [ Start ] > [ Run ]> [ % AppData % ](AppData \ Roaming )에서 npm 폴더를 삭제합니다.

  4. 존재하는 경우 c:\users[username] 디렉토리에서 npm-cache를 삭제합니다.

  5. node.js 최신 버전을 설치하고 기본 C:\Program Files\nodejs 설치 경로를 사용하십시오.

  6. Cmd 열기:


C:\Users\Jeremy>node -v
v17.1.0

C:\Users\Jeremy>npm -v
8.1.2

기본 클래스 및 상속(확장 키워드, 즉...)과 함께 ES6를 사용할 때 동일한 오류가 발생했습니다. export class Arrow extends Pointer {}).

"export" 키워드를 module.exports로 대체하는 방법을 읽을 때까지 어떤 제안도 문제 해결에 도움이 되지 않았습니다.기본 클래스를 확인했는데 클래스 서명 전에 export 키워드를 포함시키지 않았습니다.

class Pointer {}

되었다

export class Pointer {}

그 한 번의 변경으로 나의 실수가 없어졌다.

Angular 버전을 8에서9로 업데이트 할 때 원래 타이프스크립트 컴파일 오류가 발생하여 노드 14.20.1로 업그레이드해야 했습니다.업그레이드 후 위의 오류가 표시되기 시작했습니다.@angular-devkit/build-angular는 최신 버전(15.0.0 등)이었고 업그레이드된 Angular 프로젝트는 8.2였습니다.그래서 이 패키지를 다운그레이드하는 것이 문제였습니다.호환성 차트: https://ww.npmpeer.dev/packages/@angular-devkit/build-angular/compatibility

@angular-devkit/build-angular 패키지는 노드 모듈에서 올바른 파일을 생성하고 빌드를 성공적으로 실행하기 위해 매우 중요한 것으로 나타났습니다.

저는 @BeforeInsert 등의 방법으로 모든 아동 엔티티에 대해 공통 작업을 수행하는 기본 엔티티를 갖고 싶었습니다.그래서 제 구조는 이렇습니다.

entity/
-- index.ts
-- base.entity.ts
-- foo/
-- --foo.entity.ts

index.ts로 지정합니다.

export { default as MyBaseEntity } from './base.entity'; // <-- This was the problem
export { default as FooEntity } from './foo/foo.entity';

base.contracts.ts를 참조해 주세요.

import {
  BaseEntity, BeforeInsert,
  CreateDateColumn,
  ObjectIdColumn,
  UpdateDateColumn
} from 'typeorm';
import { v4 as uuidv4 } from 'uuid';

export class MyBaseEntity extends BaseEntity {
  @ObjectIdColumn()
  id!: string;

  @CreateDateColumn({name: 'created_at'})
  createdAt: Date;

  @UpdateDateColumn({name: 'updated_at'})
  updatedAt: Date;

  @BeforeInsert()
  beforeInsert() {
    this.id = uuidv4();
  }
}

그리고foo.cs.ts.

import {
  BaseEntity, BeforeInsert,
  CreateDateColumn,
  ObjectIdColumn,
  UpdateDateColumn
} from 'typeorm';
import {Injectable} from '@nestjs/common';
import { MyBaseEntity } from './../base.entity';

@Injectable()
@Entity('foo')
export class FooEntity extends MyBaseEntity {}

순환 파일 종속성은 index.ts 내보내기에서 비롯되었습니다.base.entity의 export를 삭제해야 했습니다.

Node를 Node.js 에 이 하였습니다.C:\applications은 (「」)입니다.C:\Program Files\nodejs)

Node를 기본 하면 Node.js를 으로 실행할 수 .npm install제 새로운 복제 프로젝트에 대해서요.

언급URL : https://stackoverflow.com/questions/43176006/typeerror-class-extends-value-undefined-is-not-a-function-or-null