Skip to content

Namespaces

Namespaces in TypeSpec allow you to group related types together. This organization makes your types easier to locate and helps avoid naming conflicts. Namespaces are merged across files, enabling you to reference any type from anywhere in your TypeSpec program using its namespace.

Basics

You can create a namespace using the namespace keyword.

namespace SampleNamespace {
model SampleModel {}
}

Note: The namespace name must be a valid TypeSpec identifier.

You can then use SampleNamespace from other locations:

model Foo {
sample: SampleNamespace.SampleModel;
}

Nested namespaces

Namespaces can contain sub-namespaces, offering additional layers of organization.

namespace Foo {
namespace Bar {
namespace Baz {
model SampleModel {}
}
}
}

Alternatively, you can simplify this using . notation:

namespace Foo.Bar.Baz {
model SampleModel {}
}

You can then use the sub-namespace from other locations using the fully qualified name.

model A {
sample: Foo.Bar.Baz.SampleModel;
}

File-level namespaces

You can define a namespace for all declarations within a file at the top of the file (after any import statements) using a blockless namespace statement:

namespace SampleNamespace;
model SampleModel {}

A file can only have one blockless namespace.

Using namespaces

You can expose the contents of a namespace to the current scope using the using keyword.

using SampleNamespace;
model Foo {
sample: SampleModel;
}

The bindings introduced by a using statement are local to the namespace in which they are declared. They do not become part of the namespace themselves.

namespace One {
model A {}
}
namespace Two {
using One;
alias B = A; // This is valid
}
alias C = Two.A; // This is not valid
alias C = Two.B; // This is valid