Bird
Raised Fist0
Typescriptprogramming~10 mins

Declaration merging for namespaces in Typescript - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Declaration merging for namespaces
Namespace declared first
↓
Namespace declared again with same name
↓
Declarations inside both namespaces merged
↓
Merged namespace used in code
When two namespaces with the same name are declared, TypeScript merges their contents into one combined namespace.
Execution Sample
Typescript
namespace MySpace {
  export const a = 1;
}

namespace MySpace {
  export const b = 2;
}

console.log(MySpace.a, MySpace.b);
This code shows two namespace declarations with the same name. Their contents merge, so both a and b are accessible.
Execution Table
StepActionNamespace StateOutput
1Declare namespace MySpace with export const a=1{ a: 1 }
2Declare namespace MySpace again with export const b=2{ a: 1, b: 2 }
3Access MySpace.a and MySpace.b{ a: 1, b: 2 }1 2
💡 All declarations merged; both a and b are accessible in MySpace.
Variable Tracker
Namespace MySpaceAfter 1After 2Final
Properties{ a: 1 }{ a: 1, b: 2 }{ a: 1, b: 2 }
Key Moments - 2 Insights
Why can we access both a and b from MySpace even though they are declared in separate namespace blocks?
Because TypeScript merges namespaces with the same name, combining their contents into one namespace object as shown in execution_table rows 1 and 2.
What happens if the same property name is declared in both namespaces?
The last declaration overwrites the previous one, so the property value from the later namespace block is used.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what properties does MySpace have?
A{ b: 2 }
B{ a: 1, b: 2 }
C{ a: 1 }
D{}
💡 Hint
Check the Namespace State column at step 2 in the execution_table.
At which step do both a and b become accessible in MySpace?
AStep 2
BStep 1
CStep 3
DNever
💡 Hint
Look at when the namespace contains both properties in the execution_table.
If we add export const a = 5; in the second namespace block, what will MySpace.a be after merging?
A1
Bundefined
C5
DError
💡 Hint
Declaration merging overwrites properties with the same name from later declarations (see key_moments).
Concept Snapshot
Declaration merging for namespaces:
- Multiple namespace blocks with the same name merge their contents.
- Properties and functions combine into one namespace object.
- Later declarations overwrite earlier ones if names clash.
- Enables splitting code logically while sharing the same namespace.
Full Transcript
Declaration merging for namespaces in TypeScript means when you declare the same namespace multiple times, TypeScript combines all their contents into one. For example, if you declare namespace MySpace with a property a, then declare it again with property b, the final MySpace namespace has both a and b. This lets you organize code in parts but still use one namespace. If the same property is declared twice, the last one wins. The execution table shows step-by-step how the namespace grows and how both properties become accessible.

Practice

(1/5)
1. What does declaration merging for namespaces in TypeScript allow you to do?
easy
A. Merge classes and interfaces automatically
B. Combine multiple namespace blocks with the same name into one namespace
C. Create multiple namespaces with different names in one file
D. Prevent namespaces from being extended

Solution

  1. Step 1: Understand declaration merging concept

    Declaration merging means combining multiple declarations of the same name into one.
  2. Step 2: Apply to namespaces

    For namespaces, this means multiple blocks with the same namespace name merge into a single namespace.
  3. Final Answer:

    Combine multiple namespace blocks with the same name into one namespace -> Option B
  4. Quick Check:

    Declaration merging = Combine namespaces [OK]
Hint: Namespaces with same name merge into one combined namespace [OK]
Common Mistakes:
  • Thinking namespaces with different names merge
  • Confusing merging with class or interface merging
  • Believing merging prevents extension
2. Which of the following is the correct syntax to merge two namespace declarations named Utils?
easy
A. namespace Utils { export function a() {} } namespace Utils { export function b() {} }
B. namespace Utils { export function a() {} } namespace Utils2 { export function b() {} }
C. namespace Utils { export function a() {} } class Utils { }
D. namespace Utils { export function a() {} } interface Utils { }

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    namespace Utils { export function a() {} } namespace Utils { export function b() {} } -> Option A
  4. Quick Check:

    Same namespace name + multiple blocks = merge [OK]
Hint: Use identical namespace names to merge declarations [OK]
Common Mistakes:
  • Using different namespace names expecting merge
  • Mixing namespace with class or interface of same name
  • Incorrect syntax for namespace blocks
3. What will be the output of the following TypeScript code?
namespace Data {
  export const value = 10;
}
namespace Data {
  export function getValue() { return value; }
}
console.log(Data.getValue());
medium
A. 10
B. undefined
C. ReferenceError
D. SyntaxError

Solution

  1. Step 1: Understand namespace merging

    Both namespace blocks named "Data" merge into one namespace containing both value and getValue.
  2. Step 2: Evaluate function call

    getValue() returns value which is 10, so console.log prints 10.
  3. Final Answer:

    10 -> Option A
  4. Quick Check:

    Merged namespace members accessible = 10 [OK]
Hint: Merged namespaces share members, so functions access variables [OK]
Common Mistakes:
  • Assuming separate namespaces, so value is undefined
  • Expecting runtime errors due to merging
  • Confusing variable scope inside merged namespaces
4. Identify the error in the following code that attempts to merge namespaces:
namespace Tools {
  export function toolA() { return 'A'; }
}
namespace Tools {
  const secret = 'hidden';
  export function toolB() { return secret; }
}
medium
A. Functions cannot be declared in merged namespaces
B. Duplicate namespace name causes syntax error
C. Cannot access non-exported 'secret' in merged namespace
D. 'secret' must be exported to be used inside toolB

Solution

  1. Step 1: Check variable scope in merged namespaces

    The variable secret is declared but not exported, so it is private to its namespace block.
  2. Step 2: Analyze usage of 'secret' in toolB

    Function toolB tries to return secret, but since secret is not accessible outside its block, this causes an error.
  3. Final Answer:

    Cannot access non-exported 'secret' in merged namespace -> Option C
  4. Quick Check:

    Non-exported members are block-scoped [OK]
Hint: Non-exported members are private to their block, not merged [OK]
Common Mistakes:
  • Assuming all members merge regardless of export
  • Thinking duplicate namespace names cause syntax errors
  • Believing functions can't be declared in merged namespaces
5. Given two namespace declarations below, what will 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));
hard
A. 78.53981633974483
B. Error: Duplicate function name
C. NaN
D. 79

Solution

  1. Step 1: Understand merging with duplicate function names

    When namespaces merge, later declarations override earlier ones for the same member name.
  2. Step 2: Identify which 'area' function is used

    The second namespace redefines area with rounding. So Shapes.area(5) calls the rounded version.
  3. Step 3: Calculate output

    Math.PI * 5 * 5 ≈ 78.5398, rounded is 79.
  4. Final Answer:

    79 -> Option D
  5. Quick Check:

    Later declarations override earlier ones [OK]
Hint: Later namespace members override earlier ones with same name [OK]
Common Mistakes:
  • Expecting both functions to coexist without override
  • Thinking duplicate function names cause errors
  • Ignoring rounding in second area function
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard