📖 Scenario: You are working on a TypeScript project that uses a third-party module called shapes. You want to add a new function to this module without changing its original code.
🎯 Goal: Learn how to use module augmentation syntax in TypeScript to add a new function getCircleArea to the existing shapes module.
📋 What You'll Learn
Create a module named shapes with an existing function getSquareArea.
Add a module augmentation to shapes that declares a new function getCircleArea.
Implement the new function getCircleArea inside the module augmentation.
Call both getSquareArea and getCircleArea and print their results.
💡 Why This Matters
🌍 Real World
Module augmentation is useful when you want to add features to existing libraries or modules without modifying their original source code.
💼 Career
Many TypeScript projects use third-party libraries. Knowing how to safely extend these libraries with module augmentation is a valuable skill for professional developers.
Progress0 / 4 steps
1
Create the initial shapes module
Create a module named shapes that exports a function called getSquareArea. This function takes a number side and returns the area of a square (side * side).
Typescript
Hint
Use export module shapes and inside it define export function getSquareArea(side: number): number.
2
Add module augmentation declaration
Add a module augmentation for the shapes module that declares a new function called getCircleArea which takes a number radius and returns a number.
Typescript
Hint
Use declare module "shapes" and inside it declare export function getCircleArea(radius: number): number;.
3
Implement the new function inside module augmentation
Implement the getCircleArea function inside the shapes module augmentation. It should return the area of a circle using the formula Math.PI * radius * radius.
Typescript
Hint
Inside export module shapes, add export function getCircleArea(radius: number): number with the correct return statement.
4
Call and print results of both functions
Call shapes.getSquareArea(4) and shapes.getCircleArea(3). Print their results using console.log.
Typescript
Hint
Use console.log(shapes.getSquareArea(4)) and console.log(shapes.getCircleArea(3)) to print the results.
Practice
(1/5)
1. What is the main purpose of module augmentation in TypeScript?
easy
A. To create a new module from scratch
B. To delete types from a module
C. To add or extend types in an existing module without modifying its original source code
D. To convert JavaScript code into TypeScript
Solution
Step 1: Understand module augmentation purpose
Module augmentation allows adding or extending types in existing modules without changing their original code.
Step 2: Compare options
Only To add or extend types in an existing module without modifying its original source code correctly describes this purpose. Options A, C, and D describe unrelated actions.
Final Answer:
To add or extend types in an existing module without modifying its original source code -> Option C
Quick Check:
Module augmentation = extend existing types [OK]
Hint: Module augmentation means adding types to existing modules [OK]
Common Mistakes:
Thinking it creates new modules
Confusing augmentation with deleting types
Assuming it converts JS to TS
2. Which of the following is the correct syntax to start a module augmentation for a module named "my-library"?
easy
A. module augment "my-library" { /* augmentation here */ }
B. declare module "my-library" { /* augmentation here */ }
C. augment module "my-library" { /* augmentation here */ }
D. module "my-library" augment { /* augmentation here */ }
Solution
Step 1: Recall correct syntax for module augmentation
The correct syntax uses declare module "module-name" { ... } to augment a module.
Step 2: Check options
Only declare module "my-library" { /* augmentation here */ } matches this syntax exactly. Others use invalid keywords or order.
Final Answer:
declare module "my-library" { /* augmentation here */ } -> Option B
Quick Check:
Use declare module "name" for augmentation [OK]
Hint: Start with 'declare module "module-name"' for augmentation [OK]
Common Mistakes:
Using wrong keywords like 'augment' or 'module augment'
Incorrect order of keywords
Omitting 'declare'
3. Given the following code, what will be the output of console.log(myLib.newFunction());?
import * as myLib from "my-library";
declare module "my-library" {
export function newFunction(): string;
}
myLib.newFunction = () => "Hello from augmentation!";
console.log(myLib.newFunction());
medium
A. "Hello from augmentation!"
B. TypeError: myLib.newFunction is not a function
C. undefined
D. SyntaxError
Solution
Step 1: Understand augmentation effect
The module augmentation adds a new function type declaration to "my-library". Then the function is assigned an implementation.
Step 2: Check runtime behavior
Calling myLib.newFunction() runs the assigned arrow function returning the string "Hello from augmentation!".
Final Answer:
"Hello from augmentation!" -> Option A
Quick Check:
Augmented function runs and returns string [OK]
Hint: Augmented functions can be assigned and called normally [OK]
B. The interface Config is declared twice without merging
C. The module name "utils" is invalid
D. The variable config is missing import from "utils"
Solution
Step 1: Check interface merging
Interfaces with the same name in module augmentation merge correctly, so no error there.
Step 2: Check usage of Config
The variable config uses Config but does not import or reference it properly, causing an error.
Final Answer:
The variable config is missing import from "utils" -> Option D
Quick Check:
Missing import causes error, not interface duplication [OK]
Hint: Always import types before using them outside modules [OK]
Common Mistakes:
Thinking interface redeclaration causes error
Ignoring missing imports
Assuming module name is invalid
5. You want to add a new method logInfo(message: string): void to the existing Logger class from a third-party module "logger-lib" without modifying its source. Which is the correct way to do this using module augmentation?