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이 아닙니다.
Start > Run > AppWiz.cpl > Uninstall node.js
노드 설치 디렉토리를 삭제하여 나머지 폴더 및 파일을 삭제합니다.
[ Start ] > [ Run ]> [ % AppData % ](AppData \ Roaming )에서 npm 폴더를 삭제합니다.
존재하는 경우 c:\users[username] 디렉토리에서 npm-cache를 삭제합니다.
node.js 최신 버전을 설치하고 기본 C:\Program Files\nodejs 설치 경로를 사용하십시오.
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
'programing' 카테고리의 다른 글
express.json vs bodyParser.json (0) | 2023.03.10 |
---|---|
리액트 리셋 방법JS 파일 입력 (0) | 2023.03.10 |
Wordpress 에디터의 "application/gas-events-abn" 개체는 무엇입니까? (0) | 2023.03.10 |
UI-Router state.go 상태 변경 시 콜백 (0) | 2023.03.10 |
Angularjs 컨트롤러 파괴자 (0) | 2023.03.10 |