TypeScript Reference : Namespaces

TypeScript Reference : Namespaces

Namespaces are an essential feature of TypeScript that help to organize and structure your code. They provide a way to group related classes, interfaces, functions, and variables, preventing naming conflicts and improving code readability. This article serves as a comprehensive guide to namespaces in TypeScript, covering everything you need to know to effectively use them in your projects.

When working on larger codebases, it’s important to maintain a clear and organized code structure. Namespaces offer a solution by allowing you to separate your code into logical units, making it easier to navigate and understand. By grouping related functionality together, you can avoid polluting the global scope and minimize the risk of naming clashes.

In TypeScript, namespaces are declared using the namespace keyword, followed by the namespace name. You can nest namespaces within other namespaces to create a hierarchical structure. Within a namespace, you can define classes, interfaces, functions, and variables just like you would in the global scope. The main difference is that these entities are now enclosed within the namespace, and you must use the namespace name to access them.

To access the entities within a namespace from outside the namespace, you need to use the namespaceName.entity syntax. This allows you to prevent naming conflicts while still being able to access the functionality provided by the namespace. Additionally, you can use /// <reference path=”filename.ts” /> to import types and declarations from other files into your namespace, providing modularity and encapsulation.

Table of Contents

Summary

Namespaces are a powerful feature of TypeScript that help you organize and structure your code. They allow you to group related classes, interfaces, functions, and variables into logical units, improving code readability and preventing naming conflicts. Namespaces can be nested to create a hierarchical structure, and you can access the entities within a namespace using the namespaceName.entity syntax. By using namespaces effectively, you can maintain a clear and organized code structure, making your code easier to navigate and understand.

TypeScript Reference: Namespaces – Everything You Need to Know Website Name

Introduction

When working on large-scale TypeScript projects, it’s important to organize your code in a way that promotes modularity and maintainability. One way to achieve this is by using namespaces.

What are Namespaces?

Namespaces in TypeScript provide a way to group related code together, similar to modules in other programming languages. They help avoid naming conflicts and provide a logical structure for organizing code.

Defining a Namespace

To define a namespace, you can use the `namespace` keyword followed by the name of the namespace. For example:

namespace MyNamespace {

// code goes here

}

Using a Namespace

To use the code defined within a namespace, you need to reference it using dot notation. For example:

// accessing a function within a namespace

MyNamespace.myFunction();

// accessing a class within a namespace

const instance = new MyNamespace.MyClass();

Nested Namespaces

You can also nest namespaces within other namespaces to create a hierarchical structure. This can be useful for organizing related code into logical groups. For example:

namespace MyNamespace {

export namespace SubNamespace {

// code goes here

}

}

Exporting from a Namespace

To make code within a namespace accessible outside of the namespace, you need to use the `export` keyword. This allows the code to be imported and used in other parts of your project. For example:

namespace MyNamespace {

export function myFunction() {

// code goes here

}

}

Importing a Namespace

To import a namespace into your file, you can use the `import` statement followed by the path to the file containing the namespace. For example:

import { MyNamespace } from './MyNamespace';

Conclusion

Namespaces are a powerful feature in TypeScript that help organize code and prevent naming conflicts. By using namespaces, you can create a modular and maintainable codebase for your projects.

Overview of Namespaces in TypeScript

What are Namespaces in TypeScript?

A namespace in TypeScript is a way to encapsulate code into a named container. It provides a way to organize code and helps in avoiding conflicts with other code that may have the same naming. Namespaces are primarily used for organizing large-scale JavaScript applications.

Declaring Namespaces

To declare a namespace in TypeScript, you can use the keyword namespace followed by the desired namespace name. The code within the namespace block is considered to be part of that namespace. Multiple declaration blocks can be used to define nested namespaces.

Example:

namespace MyNamespace {

// code goes here

}

Importing Namespaces

To use code from a namespace in another file, you need to import the namespace using the import statement. This allows you to access the code within the namespace in the importing file.

Example:

// importing code from MyNamespace

import { myFunction } from "./MyNamespace";

// using the function from MyNamespace

myFunction();

Exporting Code from a Namespace

To make code within a namespace accessible to other files, you need to explicitly export it using the export keyword. This makes the code within the namespace available to other files that import the namespace.

Example:

export function myFunction() {

// code goes here

}

Default Exports in Namespaces

A namespace can have a default export, similar to modules. This can be useful when you want to import the entire namespace as a single entity.

Example:

// exporting the entire namespace as a default export

export default MyNamespace;

Namespace Aliases

To simplify the usage of namespaces, you can create aliases for them using the import keyword followed by the desired alias name. This allows you to refer to the namespace using the alias instead of the full namespace name.

Example:

// creating an alias for MyNamespace

import myAlias = MyNamespace;

// using the alias to access code from MyNamespace

myAlias.myFunction();

Conclusion

Namespaces in TypeScript provide a way to organize and encapsulate code. They help in avoiding naming conflicts and provide a modular structure to large-scale JavaScript applications. By using namespaces, you can create a more maintainable and scalable codebase.

Benefits of Using Namespaces in TypeScript

1. Encapsulation

One of the key benefits of using namespaces in TypeScript is encapsulation. Namespaces provide a way to group related classes, functions, and variables into a single container. This helps in keeping the code organized and makes it easier to find and use the relevant entities.

2. Avoiding Naming Conflicts

Another advantage of namespaces is that they help in avoiding naming conflicts. By grouping related entities within a namespace, you can ensure that their names remain unique within that namespace. This is especially useful when working on large projects where multiple developers are working on different modules.

3. Modularity and Reusability

Namespaces in TypeScript promote modularity and reusability. They allow you to break down your code into smaller, more manageable units, which can be reused across different parts of your application. This makes it easier to maintain and update your codebase, as changes made to a specific namespace will not impact other parts of the application.

4. Organizing Code

Namespaces provide a way to organize your code into logical units. By grouping related entities together, you can easily navigate through your codebase and understand the relationships between different components. This improves code readability and makes it easier for developers to collaborate on the project.

5. Dependency Management

Namespaces in TypeScript can help in managing dependencies between different modules or components. By defining dependencies within a namespace, you can ensure that all the required resources are available before using them. This helps in reducing runtime errors and improves the overall stability of the application.

6. Code Isolation

Using namespaces allows you to isolate different parts of your codebase from each other. This isolation helps in preventing unintended access to internal entities, as they are only accessible within their respective namespaces. It also promotes the concept of information hiding and reduces the chances of introducing bugs or breaking changes.

7. Enhancing Tooling

Many IDEs and code editors support advanced features like code navigation, auto-completion, and inline documentation for TypeScript namespaces. By organizing your code into namespaces, you can take advantage of these features to increase your productivity and make development tasks more efficient.

8. Scalability

As your TypeScript project grows in size, using namespaces becomes even more important. Namespaces provide a way to structure your codebase and keep it manageable, even with a large number of files and entities. This scalability ensures that your project remains maintainable and allows for easier collaboration among developers.

Overall, namespaces in TypeScript offer numerous benefits including encapsulation, avoiding naming conflicts, modularity, code organization, dependency management, code isolation, enhanced tooling, and scalability. They play a vital role in building large-scale TypeScript applications and can significantly improve your development workflow.

How to Define a Namespace in TypeScript

Introduction

In TypeScript, a namespace is a way to organize and group related code. It provides a way to avoid naming conflicts and keep code modular and maintainable. This article will explain how to define a namespace in TypeScript.

Defining a Namespace

To define a namespace in TypeScript, you use the namespace keyword followed by the name of the namespace. Here’s an example:

namespace MyNamespace {

// code goes here

}

In the example above, we define a namespace called MyNamespace. You can choose any name you like for your namespace.

Adding Code to a Namespace

To add code to a namespace, simply write the code within the curly braces of the namespace definition. Here’s an example:

namespace MyNamespace {

export function greet() {

console.log("Hello, world!");

}

}

In the example above, we add a function called greet to the MyNamespace namespace. The export keyword is used to make the function accessible outside of the namespace.

Using a Namespace

To use a namespace in your code, you can reference the code within the namespace using the dot notation. Here’s an example:

// Using the greet function from the MyNamespace namespace

MyNamespace.greet();

In the example above, we call the greet function from the MyNamespace namespace using the dot notation.

Conclusion

Using namespaces in TypeScript can help you organize and structure your code. It provides a way to avoid naming conflicts and keep code modular and maintainable. This article explained how to define a namespace in TypeScript and how to add code to a namespace.

Organizing Code with Namespaces

Namespaces in TypeScript provide a way to organize code by dividing it into logical groups.

What is a namespace?

A namespace is a way to encapsulate a set of related code and variables into a single unit. It helps in preventing naming conflicts and provides a clear structure for organizing code.

Using namespaces in TypeScript

To define a namespace in TypeScript, you can use the namespace keyword followed by the name of the namespace. For example:

namespace MyNamespace {

// code goes here

}

You can declare functions, variables, interfaces, classes, and other namespaces inside a namespace. Everything declared inside a namespace is scoped to that namespace only, which means it won’t pollute the global namespace.

Accessing elements inside a namespace

To access elements (functions, variables, etc.) inside a namespace, you can use the dot notation. For example:

// Accessing a variable inside a namespace

console.log(MyNamespace.myVariable);

// Accessing a function inside a namespace

MyNamespace.myFunction();

If you want to shorten the code, you can use the import statement to import specific elements from a namespace. For example:

import { myVariable, myFunction } from 'MyNamespace';

Namespace aliases

In cases where you have long namespace names or conflicts with existing names, you can use namespace aliases to create shorter names. For example:

import myNS = MyNamespace;

console.log(myNS.myVariable);

myNS.myFunction();

Namespace organization

When organizing code with namespaces, it’s common to group related code together in nested namespaces. For example:

namespace MyNamespace {

export namespace SubNamespace {

// code goes here

}

}

In the example above, SubNamespace is nested inside MyNamespace. This allows for further organization and better separation of code.

Conclusion

Namespaces in TypeScript provide a way to organize code and prevent naming conflicts. They help in creating a clear structure for your project and make it easier to manage and maintain.

Using Namespaces to Avoid Naming Collisions

When working with a large codebase or collaborating with multiple developers, naming collisions can occur when different parts of the code use the same names for classes, functions, or variables. This can lead to confusion and errors that are difficult to debug. One way to mitigate this issue is by using namespaces in TypeScript.

What is a Namespace?

A namespace is a way to organize code in TypeScript by wrapping it in a container. It provides a hierarchical structure that helps avoid naming collisions, as all code within a namespace is scoped to that namespace.

How to Define a Namespace

To define a namespace in TypeScript, you can use the `namespace` keyword followed by the desired namespace name. Here’s an example:

namespace MyNamespace {

export class MyClass {

// class implementation

}

}

In this example, the `MyNamespace` namespace contains a class called `MyClass`. The `export` keyword is used to make the class accessible outside the namespace.

Using Namespaces to Avoid Naming Collisions

Using Namespaces to Avoid Naming Collisions

By organizing your code into namespaces, you can avoid naming collisions between different parts of your codebase. For example, if two developers are working on separate modules of an application and both create a class called `User`, placing each class in a separate namespace will prevent conflicts:

// Developer 1

namespace Module1 {

export class User {

// class implementation

}

}

// Developer 2

namespace Module2 {

export class User {

// class implementation

}

}

In this example, `Module1.User` and `Module2.User` are unique and do not conflict with each other.

Accessing Namespaces

To access code within a namespace, you can use the dot notation. For example, to create an instance of the `MyClass` from the previous example:

const myInstance = new MyNamespace.MyClass();

In this example, `MyNamespace` is the namespace and `MyClass` is the class within that namespace.

Using Aliases

If you find yourself repeatedly using a long namespace name, you can create an alias using the `import` statement. This allows you to refer to the namespace using a shorter name. Here’s an example:

import MyNS = MyNamespace;

const myInstance = new MyNS.MyClass();

In this example, `MyNS` is an alias for `MyNamespace`, allowing you to use the shorter name when accessing code within the namespace.

Conclusion

By using namespaces in TypeScript, you can organize your code and avoid naming collisions, making it easier to work with large codebases and collaborate with multiple developers. Namespaces provide a way to encapsulate code and limit its scope, reducing the chances of conflicts and improving code maintainability.

Importing and Exporting in Namespaces

In TypeScript, namespaces are used to group related code together and prevent conflicts between identifiers. Namespaces can be used to organize code into logical modules, making it easier to manage and maintain large codebases.

Importing Namespaces

To use code from a namespace in another file, you need to import the namespace using the import keyword. The syntax for importing a namespace is as follows:

import * as NamespaceName from "path/to/file";

The import * as NamespaceName statement imports all the exported members of the namespace into the NamespaceName object.

For example, if you have a file called math.ts that contains a namespace called MathUtils with a function add:

export namespace MathUtils {

export function add(a: number, b: number): number {

return a + b;

}

}

To use the add function in another file, you would import the MathUtils namespace like this:

import * as MathUtils from "./math";

console.log(MathUtils.add(2, 3)); // Output: 5

Exporting Namespaces

To make a namespace accessible to other files, you need to export it using the export keyword. The syntax for exporting a namespace is as follows:

export namespace NamespaceName {

// Code goes here

}

For example, to export the MathUtils namespace from the previous example, you would use the following code:

export namespace MathUtils {

// Code goes here

}

After exporting the namespace, it can be imported and used in other files as shown earlier.

Usage Tips

  • It is recommended to use a unique and descriptive name for the namespace to avoid naming conflicts and make the code more readable.
  • When importing a namespace, you can choose to give it a different name by using the as keyword. For example: import * as MyNamespace from "path/to/file";
  • You can also import specific members from a namespace by using the import keyword followed by the member names enclosed in curly braces. For example: import { member1, member2 } from "path/to/file";
  • If you want to use the exported members directly without accessing them through the namespace object, you can use the import { member } from "path/to/file"; syntax instead.

By following these guidelines, you can effectively import and export code in TypeScript namespaces, making your codebase clean and organized.

Nested Namespaces in TypeScript

In TypeScript, namespaces are used to organize code into logical groups and prevent naming collisions. Nested namespaces allow you to further organize your code by creating hierarchical structures. This can be useful when working with large projects that require a lot of code organization.

Defining a Nested Namespace

To define a nested namespace in TypeScript, you can simply nest the namespace declarations within each other. For example:

namespace MyNamespace {

export namespace SubNamespace {

export class MyClass {

// class implementation goes here

}

}

}

In the above example, we have defined a namespace called MyNamespace which contains a nested namespace called SubNamespace. Inside the SubNamespace, we have defined a class called MyClass.

Accessing Nested Namespaces

To access a nested namespace, you can use the dot notation. For example, to access the MyClass class from the previous example:

const myInstance = new MyNamespace.SubNamespace.MyClass();

Here, we are creating an instance of the MyClass class by specifying the full namespace path.

Importing Nested Namespaces

If you want to import a nested namespace from another file, you can use the import keyword. For example:

import { MyNamespace } from './myNamespace';

const myInstance = new MyNamespace.SubNamespace.MyClass();

Here, we are importing the MyNamespace namespace from the myNamespace file and then accessing the MyClass class using the dot notation.

Conclusion

Nested namespaces in TypeScript can help you organize your code in a hierarchical manner, making it easier to manage and avoid naming collisions. By nesting namespaces, you can create a more logical structure for your codebase. Additionally, nested namespaces can be accessed using dot notation and imported from other files.

Namespace Aliases in TypeScript

In TypeScript, namespace aliases are used to create shorter names for long and complex namespaces. This can make the code more readable and easier to work with. Namespace aliases are especially useful when working with nested namespaces.

Syntax

To create a namespace alias, you use the import keyword followed by the alias name, the = operator, and the full namespace name enclosed in curly braces:

import alias = namespace;

Here, alias is the name of the alias you want to create, and namespace is the full name of the namespace you want to alias.

Example

Let’s say we have a complex nested namespace called myLibrary.utils.math. To create a namespace alias for this, we can do the following:

import mathUtils = myLibrary.utils.math;

Now, instead of using the full namespace name every time we want to access something within the math namespace, we can use the shorter mathUtils alias.

mathUtils.calculateSum(2, 3); // equivalent to myLibrary.utils.math.calculateSum(2, 3)

Benefits of Using Namespace Aliases

Namespace aliases offer several benefits:

  1. Improved Readability: Using shorter alias names can make the code more readable and easier to understand.
  2. Easier Maintenance: If the namespace name changes, you only need to update the alias declaration instead of every occurrence
  3. Reduced Typing: With shorter alias names, you can save time and reduce the amount of typing required.

Overall, namespace aliases are a convenient way to simplify the usage of long and complex namespaces in TypeScript.

Working with External Libraries and Namespaces

In TypeScript, you can work with external libraries by using namespaces. Namespaces allow you to organize your code into logical modules and avoid naming collisions.

Importing External Libraries

To use an external library in your TypeScript project, you need to import it using the import statement. The syntax for importing a namespace from an external library is:

import * as namespaceName from 'libraryName';

For example, to import the lodash library, you can write:

import * as _ from 'lodash';

Once the library is imported, you can access its functions and variables using the namespaceName alias. For example, to use the forEach function from lodash, you can write:

_.forEach(array, (value) => {

console.log(value);

});

Defining External Namespace Declarations

If the external library you are using does not have a TypeScript declaration file, you can define your own external namespace declarations. This allows you to provide type information for the library and prevent type errors.

To define an external namespace declaration, create a new .d.ts file and use the following syntax:

declare namespace namespaceName {

// declaration statements

}

For example, if you want to define a namespace declaration for the lodash library, you can create a file named lodash.d.ts with the following content:

declare namespace _ {

function forEach(array: T[], callback: (value: T) => void): void;

}

After defining the namespace declaration, you can import and use the library as described in the previous section.

Working with Namespaces

In addition to working with external libraries, you can also use namespaces to organize your own code into modules. Namespaces allow you to group related code together and separate it from other parts of your application.

To define a namespace in TypeScript, use the namespace keyword followed by the name of the namespace:

namespace NamespaceName {

// code goes here

}

To access code within a namespace, you can use dot notation:

NamespaceName.functionName();

NamespaceName.variableName;

You can also nest namespaces within each other to create a hierarchical structure:

namespace OuterNamespace {

export namespace InnerNamespace {

// code goes here

}

}

To use code from a namespace in another file, you need to use the /// <reference path="path/to/file.ts" /> syntax at the beginning of the file:

/// <reference path="path/to/file.ts" />

// code using the referenced namespace

Note: The /// <reference path="..." /> syntax is only required for namespaces that are not declared in an external declaration file.

Conclusion

Working with external libraries and namespaces in TypeScript allows you to organize your code and make use of existing functionality. By importing external libraries and defining namespaces, you can create modular and maintainable code.

Tips and Tricks for Using Namespaces in TypeScript

1. Organize Your Code

One of the main benefits of using namespaces in TypeScript is their ability to organize your code into logical units. When creating namespaces, consider grouping related classes, interfaces, and functions together. This will make it easier for other developers to understand your code and navigate through it.

2. Avoid Global Namespace Pollution

When working with namespaces, it’s important to avoid polluting the global namespace with too many variables and functions. To prevent this, consider using the export keyword to only expose the necessary symbols from your namespaces. This will reduce the chances of naming conflicts and make your code more maintainable.

3. Use Aliasing to Simplify Access

If your codebase contains nested namespaces or long namespace paths, you can simplify accessing the symbols by using aliasing. TypeScript allows you to create shorter aliases for namespaces using the import keyword with the = as syntax. This can make your code more readable and reduce typing errors.

4. Leverage Module Augmentation

Namespaces can be combined with modules in TypeScript to augment existing modules with additional functionality. This can be useful when working with external libraries or when extending the functionality of third-party code. By using namespaces to add or modify existing module declarations, you can easily extend the behavior of existing code without modifying its original source files.

5. Use Triple-Slash Directives for Reference Path

If you’re working with multiple files that are part of the same namespace, you can use triple-slash directives to reference the dependency order. By including a /// <reference path="..." /> directive at the top of each file, you can ensure that the files are compiled in the correct order, avoiding any potential circular dependency issues.

6. Consider Using Modules Instead

While namespaces can be useful for organizing code, it’s important to consider whether using modules might be a better approach for your project. Modules provide better encapsulation, explicit dependency management, and support for static analysis tools. If you’re starting a new project or refactoring an existing one, consider using modules instead of namespaces.

7. Use a Namespace Alias for Convenience

When working with namespaces, you can create a namespace alias to simplify access to its symbols. This can be particularly useful when dealing with long namespace names or when you need to reference symbols often. By using the import keyword with the = as syntax, you can create a shorter alias for a namespace and easily access its symbols throughout your code.

8. Avoid Circular Dependencies

When working with multiple namespaces, it’s important to avoid circular dependencies. Circular dependencies occur when two or more namespaces depend on each other, directly or indirectly. To prevent circular dependencies, make sure to carefully design your namespaces and dependencies, and avoid situations where namespaces rely on each other’s functionality.

9. Use Namespaces for Legacy Code

If you’re working with an existing codebase that heavily relies on namespaces, it may be impractical to refactor it all into modules. In such cases, namespaces can still be useful for organizing and maintaining the code. Consider using namespaces as a way to gradually migrate the codebase to a more modular architecture.

10. Keep Your Namespaces Simple

When creating namespaces, it’s important to keep them simple and focused. Avoid creating deeply nested or overly complex namespaces, as this can make your code harder to understand and maintain. Aim for a clear and intuitive namespace structure that reflects the logical organization of your code.

TypeScript Namespace Best Practices

1. Use namespaces sparingly

One of the best practices when using TypeScript namespaces is to use them sparingly. Namespaces should only be used when there is a clear need for organizing related code. Overusing namespaces can lead to unnecessary complexity and hinder code maintainability.

2. Prefer modules over namespaces

In TypeScript, modules are recommended over namespaces for structuring and organizing code. Modules provide better encapsulation and allow for better control over the visibility of code using the import and export statements. Namespaces, on the other hand, introduce a global scope, which can lead to naming conflicts and make it harder to manage dependencies.

3. Use a module bundler

When using modules in TypeScript, it’s recommended to use a module bundler like webpack or Rollup to bundle and optimize the code for production. This helps to reduce the number of network requests and improve the overall performance of your application.

4. Follow a consistent naming convention

When naming namespaces in TypeScript, it’s important to follow a consistent naming convention to ensure code readability and maintainability. A common convention is to use PascalCase for namespace names, which follows the same naming convention as classes and interfaces in TypeScript.

5. Avoid circular dependencies

When organizing code into namespaces or modules, it’s important to avoid circular dependencies. Circular dependencies occur when two or more namespaces or modules depend on each other, creating a dependency loop that can lead to compilation errors or runtime issues. To avoid circular dependencies, it’s important to carefully design the code structure and separate concerns.

6. Use explicit imports

When using modules, it’s recommended to use explicit imports rather than relying on the default import behavior. This helps to make the code more readable and avoids potential issues with conflicting imports.

7. Keep namespaces and modules focused

When organizing code into namespaces or modules, it’s important to keep them focused and avoid creating overly large or complex namespaces or modules. Instead, break down the code into smaller and more manageable namespaces or modules that are focused on specific functionalities or areas of the application.

8. Document your namespaces and modules

To improve the maintainability of your code, it’s important to document your namespaces and modules. Provide clear and concise descriptions of the purpose and usage of each namespace or module. This helps other developers understand the code and reduces the learning curve when working on the project.

9. Regularly refactor and optimize your code

As your codebase grows, it’s important to regularly refactor and optimize your code. This includes organizing code into namespaces or modules, removing unused code, and improving code structure and readability. Regular refactoring and optimization help to maintain a clean and efficient codebase.

10. Stay up to date with TypeScript best practices

Lastly, to ensure you are following the best practices, it’s important to stay up to date with the latest TypeScript documentation and best practices. TypeScript is an evolving language, and new best practices may emerge over time, so staying informed will help you write better code.

FAQ:

What is a namespace in TypeScript?

In TypeScript, a namespace is used to organize code into logical groups and prevent naming collisions. It provides a way to encapsulate code and helps in modularizing the application.

How do you declare a namespace in TypeScript?

To declare a namespace in TypeScript, you use the `namespace` keyword followed by the namespace name. For example, `namespace MyNamespace { // code goes here }`.

What is the purpose of using namespaces?

Namespaces in TypeScript are used to avoid naming conflicts and provide a way to group related code together. They help in organizing the codebase, improving code maintainability, and allow for better code reuse.

Can you have nested namespaces in TypeScript?

Yes, TypeScript allows you to have nested namespaces. You can define a namespace inside another namespace by using dot notation. For example, `namespace OuterNamespace.InnerNamespace { // code goes here }`.

What is the difference between namespace and module in TypeScript?

In TypeScript, namespaces are used to organize code within a global scope, while modules are used to organize code within a file or across multiple files. Namespaces can be used in both global and module scopes, but modules are more recommended for larger applications.

How can you access a namespace in TypeScript?

To access code inside a namespace, you can either use the fully qualified name with the dot notation (`NamespaceName.FunctionName`), or you can import the namespace using the `import` statement and then access the code directly (`import * as MyNamespace from ‘./myNamespace’;`).

Can namespaces be nested inside modules in TypeScript?

Yes, in TypeScript, you can have namespaces nested inside modules. This allows for further organization of code within a module and helps in avoiding naming conflicts.