提问人:lulliezy 提问时间:10/9/2023 最后编辑:derpirscherlulliezy 更新时间:10/9/2023 访问量:107
在另一个文件中初始化变量时,无法在初始化错误之前访问变量
Cannot access variable before initialization error when variable is initialized in another file
问:
我有这样的东西:
photo.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm"
import { User } from "./User"
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number
@Column()
url: string
@ManyToOne(() => User, (user) => user.photos)
user: User
}
user.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm"
import { Photo } from "./Photo"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
@OneToMany(() => Photo, (photo) => photo.user)
photos: Photo[]
}
正在运行,并且我已经安装,但收到以下错误:nodemon
ts-node
ReferenceError: Cannot access 'User' before initialization
at file:///path/to/project/src/database/entities/photo.ts:14:9
at ModuleJob.run (node:internal/modules/esm/module_job:194:25)
这个错误打败了我,因为我甚至不知道从哪里开始,因为坦率地说,我以前从未遇到过这个错误,任何帮助将不胜感激。
版本:
node: v18.17.1
ts-node: v10.9.1
nodemon: v3.0.1
typescript: v5.2.2
答:
0赞
T.J. Crowder
#1
问题在于,您的两个模块具有循环关系,并且它们都尝试在初始模块执行期间使用另一个导出的成员。因此,必须首先运行一个或另一个(在您的示例中),并且当它尝试使用 时,导出的成员尚未初始化,因为尚未执行。我不得不承认,我有点惊讶你把它作为一个运行时错误,因为我看到它们在模块代码顶层的循环中被使用的唯一地方是在应用于 和 的类型中。也许这与装饰器正在做的事情有关,或者与 和 既是类型又是值(构造函数)这一事实有关。photo.ts
User
user.ts
user
photos
User
Photo
TypeORM网站在这里谈到了“循环关系”。它说使用类型来避免这种情况(so 而不是 ,而不是 )。显然,这阻止了循环的出现。Relation
user: Relation<User>
user: User
photos: Relation<Photo[]>
photos: Photo[]
评论
photo.ts
User
user.ts
User
Photo
Relation