Building a Simple NestJS Service with TypeScript-First Philosophy
📖 Scenario: You are creating a small backend service using NestJS. NestJS encourages a TypeScript-first approach, meaning you write your data types and logic in TypeScript first, which helps catch errors early and makes your code easier to understand.In this project, you will create a simple service that manages a list of books with their titles and authors.
🎯 Goal: Build a NestJS service that stores a list of books using TypeScript interfaces and classes. You will define the data structure, configure a service variable, implement a method to retrieve books, and complete the service class.
📋 What You'll Learn
Create a TypeScript interface for a Book with title and author as strings
Create a service class called BooksService
Add a private array variable books of type Book[] with initial data
Implement a method getAllBooks() that returns the array of books
Complete the service class with the correct export statement
💡 Why This Matters
🌍 Real World
Backend services often manage data with clear types to avoid bugs. NestJS uses TypeScript-first philosophy to help developers write safer and clearer code.
💼 Career
Understanding how to define data types and services in NestJS is essential for backend development roles using modern TypeScript frameworks.
Progress0 / 4 steps
1
Define the Book interface
Create a TypeScript interface called Book with two string properties: title and author.
NestJS
Hint
Use the interface keyword to define the shape of a book object.
2
Create the BooksService class with initial data
Create a class called BooksService. Inside it, add a private variable called books of type Book[] and initialize it with two books: { title: 'The Hobbit', author: 'J.R.R. Tolkien' } and { title: '1984', author: 'George Orwell' }.
NestJS
Hint
Use private books: Book[] = [...] inside the class to store the books.
3
Add a method to get all books
Inside the BooksService class, add a public method called getAllBooks() that returns the books array.
NestJS
Hint
Define a method that returns the private books array.
4
Export the BooksService class
Make sure the BooksService class is exported so it can be used in other parts of the application.
NestJS
Hint
Use the export keyword before the class declaration.
Practice
(1/5)
1. What is the main benefit of the TypeScript-first philosophy in NestJS?
easy
A. It makes the app run faster at runtime.
B. It removes the need for any testing.
C. It helps catch errors early by using types.
D. It allows writing code without any types.
Solution
Step 1: Understand TypeScript's role
TypeScript adds types to JavaScript, which helps find mistakes before running the code.
Step 2: Connect to NestJS philosophy
NestJS uses TypeScript-first to improve code safety and clarity by leveraging types.
Final Answer:
It helps catch errors early by using types. -> Option C
Quick Check:
TypeScript-first = catch errors early [OK]
Hint: TypeScript-first means using types to find errors early [OK]
Common Mistakes:
Thinking it makes runtime faster
Believing it removes need for tests
Assuming it means no types needed
2. Which of the following is the correct way to define a typed controller method in NestJS using TypeScript-first philosophy?
easy
A. async getUser(): Promise<User> { return this.userService.find(); }
B. async getUser() { return this.userService.find(); }
C. async getUser(): any { return this.userService.find(); }
D. async getUser(): string { return this.userService.find(); }
Solution
Step 1: Check method return type
TypeScript-first means explicitly typing the return value, here Promise<User>.
Step 2: Compare options
async getUser(): Promise<User> { return this.userService.find(); } uses correct typing; others omit or use wrong types like any or string.
Final Answer:
async getUser(): Promise<User> { return this.userService.find(); } -> Option A
A. The method should not be async if it returns a Promise.
B. The return type should be Promise if user might not exist.
C. The parameter id should be typed as number not string.
D. The decorator @Get is missing a path.
Solution
Step 1: Check return type correctness
If findUser can return null when user not found, the controller must reflect that in its return type.
Step 2: Compare options
The return type should be Promise if user might not exist. correctly points out the return type should allow null. The parameter id should be typed as number not string. is not always true because id can be string if parsed later.
Final Answer:
The return type should be Promise if user might not exist. -> Option B
Quick Check:
Return type must match possible null values [OK]
Hint: Return types must include null if possible [OK]
Common Mistakes:
Ignoring possible null return
Thinking async keyword is wrong here
Assuming @Get needs path always
5. You want to create a NestJS DTO (Data Transfer Object) that enforces a required name string and an optional age number using TypeScript-first philosophy. Which of these is the best TypeScript definition?
hard
A. export class CreateUserDto { name: string; age?: number; }
B. export interface CreateUserDto { name?: string; age: number; }
C. export type CreateUserDto = { name?: string; age?: number; };
D. export class CreateUserDto { name?: string; age: number; }
Solution
Step 1: Identify required and optional properties
The name must be required (no question mark), age optional (with question mark).
Step 2: Match with options
export class CreateUserDto { name: string; age?: number; } correctly defines name as required and age as optional in a class, which is standard for NestJS DTOs.
Final Answer:
export class CreateUserDto { name: string; age?: number; } -> Option A
Quick Check:
Required name, optional age = export class CreateUserDto { name: string; age?: number; } [OK]
Hint: Use '?' for optional properties, omit for required [OK]
Common Mistakes:
Marking required fields as optional
Using interface instead of class for DTO
Making optional fields required
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.