TypeORM Decorators Cheatsheet
Quick reference for TypeORM: entity decorators, columns, relations, indexes, listeners, and query operations.
| Feature | Description | Example | Category |
|---|---|---|---|
| @Entity() | Define database entity/table | @Entity() class User { // properties } | Entity |
| @PrimaryGeneratedColumn() | Auto-increment primary key | @PrimaryGeneratedColumn() id: number; | Entity |
| @PrimaryColumn() | Define primary key column | @PrimaryColumn() id: string; | Entity |
| @Generated("uuid") | Auto-generate UUID | @PrimaryGeneratedColumn("uuid") id: string; | Entity |
| @Column() | Basic column definition | @Column() name: string; | Columns |
| @Column({ type }) | Column with specific type | @Column({ type: "varchar", length: 100 }) email: string; | Columns |
| @Column({ nullable }) | Allow null values | @Column({ nullable: true }) middleName?: string; | Columns |
| @Column({ unique }) | Unique constraint | @Column({ unique: true }) email: string; | Columns |
| @Column({ default }) | Default column value | @Column({ default: true }) isActive: boolean; | Columns |
| @CreateDateColumn() | Auto-set creation timestamp | @CreateDateColumn() createdAt: Date; | Columns |
| @UpdateDateColumn() | Auto-update timestamp | @UpdateDateColumn() updatedAt: Date; | Columns |
| @DeleteDateColumn() | Soft delete timestamp | @DeleteDateColumn() deletedAt: Date; | Columns |
| @VersionColumn() | Optimistic locking version | @VersionColumn() version: number; | Columns |
| @OneToOne() | One-to-one relationship | @OneToOne(() => Profile) @JoinColumn() profile: Profile; | Relations |
| @OneToMany() | One-to-many relationship | @OneToMany(() => Post, post => post.user) posts: Post[]; | Relations |
| @ManyToOne() | Many-to-one relationship | @ManyToOne(() => User, user => user.posts) user: User; | Relations |
| @ManyToMany() | Many-to-many relationship | @ManyToMany(() => Role) @JoinTable() roles: Role[]; | Relations |
| @JoinColumn() | Specify join column | @JoinColumn({ name: "user_id" }) user: User; | Relations |
| @JoinTable() | Join table for many-to-many | @JoinTable({ name: "user_roles" }) roles: Role[]; | Relations |
| @Index() | Create database index | @Index() @Column() email: string; | Indexes |
| @Index(multiple) | Composite index | @Entity() @Index(["firstName", "lastName"]) class User {} | Indexes |
| @Unique() | Unique constraint | @Entity() @Unique(["email"]) class User {} | Indexes |
| @BeforeInsert() | Hook before insert | @BeforeInsert() hashPassword() { this.password = hash(this.password); } | Listeners |
| @AfterInsert() | Hook after insert | @AfterInsert() logInsert() { console.log("Inserted:", this.id); } | Listeners |
| @BeforeUpdate() | Hook before update | @BeforeUpdate() validateUpdate() { // validation logic } | Listeners |
| @AfterUpdate() | Hook after update | @AfterUpdate() logUpdate() { console.log("Updated:", this.id); } | Listeners |
| @BeforeRemove() | Hook before deletion | @BeforeRemove() cleanup() { // cleanup logic } | Listeners |
| @AfterLoad() | Hook after entity loaded | @AfterLoad() computeFullName() { this.fullName = this.firstName + " " + this.lastName; } | Listeners |
| Find All | Retrieve all entities | const users = await userRepo.find(); | Query |
| Find One | Find single entity | const user = await userRepo.findOne({ where: { id: 1 } }); | Query |
| Find with Relations | Load related entities | const user = await userRepo.findOne({ where: { id: 1 }, relations: ["posts"] }); | Query |
| Save | Insert or update entity | const user = new User(); user.name = "John"; await userRepo.save(user); | Query |
| Remove | Delete entity | await userRepo.remove(user); | Query |
| Query Builder | Complex queries | const users = await userRepo .createQueryBuilder("user") .where("user.age > :age", { age: 18 }) .getMany(); | Query |