Declaration merging for namespaces in Typescript - Time & Space Complexity
We want to understand how the time it takes to run code changes when using declaration merging with namespaces in TypeScript.
Specifically, how does combining multiple namespace parts affect the work the program does?
Analyze the time complexity of the following code snippet.
namespace Shapes {
export function area(radius: number) {
return Math.PI * radius * radius;
}
}
namespace Shapes {
export function circumference(radius: number) {
return 2 * Math.PI * radius;
}
}
const r = 5;
console.log(Shapes.area(r));
console.log(Shapes.circumference(r));
This code shows two parts of the same namespace merged together, each adding a function.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Calling functions inside the merged namespace.
- How many times: Each function is called once here, so constant time.
Since the namespace merging happens at compile time, the runtime cost depends on how many functions are called.
| Input Size (number of functions) | Approx. Operations |
|---|---|
| 2 | 2 function calls |
| 10 | 10 function calls |
| 100 | 100 function calls |
Pattern observation: The execution grows linearly with the number of functions called, not with how many namespace parts exist.
Time Complexity: O(n)
This means the time grows directly with how many functions you call from the merged namespace.
[X] Wrong: "Merging namespaces makes the program slower because it combines code at runtime."
[OK] Correct: Namespace merging happens before running the program, so it does not add runtime overhead by itself.
Understanding how declaration merging works helps you explain how TypeScript organizes code without slowing down your program.
"What if we added many nested namespaces inside the merged namespace? How would that affect the time complexity?"
Practice
Solution
Step 1: Understand declaration merging concept
Declaration merging means combining multiple declarations of the same name into one.Step 2: Apply to namespaces
For namespaces, this means multiple blocks with the same namespace name merge into a single namespace.Final Answer:
Combine multiple namespace blocks with the same name into one namespace -> Option BQuick Check:
Declaration merging = Combine namespaces [OK]
- Thinking namespaces with different names merge
- Confusing merging with class or interface merging
- Believing merging prevents extension
Utils?Solution
Step 1: Check namespace names
Only namespaces with the exact same name merge. namespace Utils { export function a() {} } namespace Utils { export function b() {} } uses "Utils" twice.Step 2: Verify syntax correctness
namespace Utils { export function a() {} } namespace Utils { export function b() {} } correctly declares two namespace blocks with functions inside, which will merge.Final Answer:
namespace Utils { export function a() {} } namespace Utils { export function b() {} } -> Option AQuick Check:
Same namespace name + multiple blocks = merge [OK]
- Using different namespace names expecting merge
- Mixing namespace with class or interface of same name
- Incorrect syntax for namespace blocks
namespace Data {
export const value = 10;
}
namespace Data {
export function getValue() { return value; }
}
console.log(Data.getValue());Solution
Step 1: Understand namespace merging
Both namespace blocks named "Data" merge into one namespace containing bothvalueandgetValue.Step 2: Evaluate function call
getValue()returnsvaluewhich is 10, soconsole.logprints 10.Final Answer:
10 -> Option AQuick Check:
Merged namespace members accessible = 10 [OK]
- Assuming separate namespaces, so value is undefined
- Expecting runtime errors due to merging
- Confusing variable scope inside merged namespaces
namespace Tools {
export function toolA() { return 'A'; }
}
namespace Tools {
const secret = 'hidden';
export function toolB() { return secret; }
}Solution
Step 1: Check variable scope in merged namespaces
The variablesecretis declared but not exported, so it is private to its namespace block.Step 2: Analyze usage of 'secret' in toolB
FunctiontoolBtries to returnsecret, but sincesecretis not accessible outside its block, this causes an error.Final Answer:
Cannot access non-exported 'secret' in merged namespace -> Option CQuick Check:
Non-exported members are block-scoped [OK]
- Assuming all members merge regardless of export
- Thinking duplicate namespace names cause syntax errors
- Believing functions can't be declared in merged namespaces
console.log(Shapes.area(5)); output?namespace Shapes {
export function area(radius: number) {
return Math.PI * radius * radius;
}
}
namespace Shapes {
export function perimeter(radius: number) {
return 2 * Math.PI * radius;
}
export function area(radius: number) {
return Math.round(Math.PI * radius * radius);
}
}
console.log(Shapes.area(5));Solution
Step 1: Understand merging with duplicate function names
When namespaces merge, later declarations override earlier ones for the same member name.Step 2: Identify which 'area' function is used
The second namespace redefinesareawith rounding. SoShapes.area(5)calls the rounded version.Step 3: Calculate output
Math.PI * 5 * 5 ≈ 78.5398, rounded is 79.Final Answer:
79 -> Option DQuick Check:
Later declarations override earlier ones [OK]
- Expecting both functions to coexist without override
- Thinking duplicate function names cause errors
- Ignoring rounding in second area function
Ready to prove it?
Pass the test and this pattern moves unknown
