📖 Scenario: You are building a simple NestJS application to manage a list of books in a library. Each book has a title, an author, and a year of publication.
🎯 Goal: Create a basic entity class called Book using TypeORM decorators to define the database table and columns.
📋 What You'll Learn
Create a class named Book decorated with @Entity()
Add a primary column id with auto-generated number
Add a column title of type string
Add a column author of type string
Add a column year of type number
💡 Why This Matters
🌍 Real World
Defining entities is essential for building backend applications that interact with databases, such as managing books in a library system.
💼 Career
Understanding entity definition is a key skill for backend developers working with NestJS and TypeORM in real-world projects.
Progress0 / 4 steps
1
Create the Book class with Entity decorator
Create a class called Book and decorate it with @Entity() from typeorm.
NestJS
Hint
Use @Entity() above the class declaration to mark it as a database entity.
2
Add the primary key column id
Import PrimaryGeneratedColumn from typeorm and add a property id decorated with @PrimaryGeneratedColumn() of type number inside the Book class.
NestJS
Hint
The id property should have @PrimaryGeneratedColumn() decorator and be of type number.
3
Add columns for title, author, and year
Import Column from typeorm. Add three properties inside the Book class: title and author as strings, and year as a number. Decorate each with @Column().
NestJS
Hint
Use @Column() decorator for each property and specify the correct types.
4
Export the Book entity class
Make sure the Book class is exported using export class Book so it can be used in other parts of the application.
NestJS
Hint
Check that the class declaration starts with export class Book.
Practice
(1/5)
1. What is the purpose of the @Entity() decorator in a NestJS application using TypeORM?
easy
A. It marks a class as a database table representation.
B. It defines a method to fetch data from the database.
C. It creates a new database connection.
D. It styles the output of a component.
Solution
Step 1: Understand the role of @Entity()
The @Entity() decorator tells NestJS and TypeORM that the class represents a database table.
Step 2: Differentiate from other decorators
Other decorators like @Column() define table columns, but @Entity() marks the whole class as a table.
Final Answer:
It marks a class as a database table representation. -> Option A
Quick Check:
@Entity() = Table marker [OK]
Hint: Remember: @Entity() means 'this class is a table' [OK]
Common Mistakes:
Confusing @Entity() with database connection setup
Thinking @Entity() defines methods or styles
Mixing up @Entity() with @Column()
2. Which of the following is the correct way to define a string column named title in a NestJS entity using TypeORM?
easy
A. @Column({ type: 'number' }) title: string;
B. @Column('boolean') title: string;
C. @Column() title: string;
D. @Column({ length: 255 }) title: number;
Solution
Step 1: Identify the correct @Column() usage for a string
By default, @Column() without options assumes a string type in TypeORM.
Step 2: Check type consistency
The property type should be string to match the column type.
Final Answer:
@Column() title: string; -> Option C
Quick Check:
Default @Column() = string column [OK]
Hint: Use @Column() alone for simple string columns [OK]
Common Mistakes:
Setting wrong type in @Column() options
Mismatching property type and column type
Using number type for string properties
3. Given the following entity code, what will be the type of the age column in the database?
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column({ type: 'int' })
age: number;
}
medium
A. INTEGER (number)
B. VARCHAR (string)
C. BOOLEAN
D. DATE
Solution
Step 1: Check the @Column() decorator on age
The decorator specifies { type: 'int' }, which means an integer column in the database.
Step 2: Match the property type
The property age is a number, matching the integer database type.
Final Answer:
INTEGER (number) -> Option A
Quick Check:
{ type: 'int' } means integer column [OK]
Hint: Look for { type: 'int' } to identify integer columns [OK]
Common Mistakes:
Assuming default string type without checking options
Confusing int with boolean or date
Ignoring the explicit type option in @Column()
4. Identify the error in the following entity definition:
B. Property type number does not match column type varchar
C. Primary key column missing
D. Incorrect import statement
Solution
Step 1: Check property and column type consistency
The name property is typed as number but the column type is varchar, which expects a string.
Step 2: Confirm other parts are correct
@Entity() is present, primary key is defined, and imports are correct.
Final Answer:
Property type number does not match column type varchar -> Option B
Quick Check:
Property type must match column type [OK]
Hint: Match property type with @Column() type options [OK]
Common Mistakes:
Using wrong property type for string columns
Forgetting to add @Entity()
Missing primary key decorator
5. You want to define an entity Order with an auto-generated primary key id, a string customerName limited to 150 characters, and an optional numeric discount that can be null. Which is the correct entity definition?
hard
A. import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Order {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 150 })
customerName: string;
@Column({ type: 'int', nullable: false })
discount: number;
}
B. import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Order {
@PrimaryGeneratedColumn()
id: string;
@Column({ length: 150 })
customerName: string;
@Column({ type: 'float' })
discount: number;
}
C. import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Order {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: 'varchar', length: 150 })
customerName: number;
@Column({ type: 'float', nullable: true })
discount: number;
}
D. import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Order {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 150 })
customerName: string;
@Column({ type: 'float', nullable: true })
discount?: number;
}
Solution
Step 1: Verify primary key definition
@PrimaryGeneratedColumn() on id: number creates an auto-incrementing integer primary key. A string type would be incorrect without additional configuration like UUID.
Step 2: Check customerName
@Column({ length: 150 }) with string type creates a VARCHAR(150) column. A number type mismatches.
Step 3: Confirm discount
@Column({ type: 'float', nullable: true }) with optional discount?: number allows null values. Missing nullable: true, wrong type like 'int', or non-optional fails.
Final Answer:
The entity with number id, string customerName({length:150}), optional nullable float discount -> Option D
Quick Check:
Match types, nullable, and optional properties carefully [OK]
Hint: Use nullable: true and optional property for nullable columns [OK]
Common Mistakes:
Mismatching property types and column types
Forgetting to mark nullable columns as optional
Using wrong primary key type
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.