Any way to declare a nest class structure in typescript?
Solution 1:
This seems like it has been fixed in versions 0.9.1.1 and later. You just have to create a module with the same name as the class where you want to nest types, and put your nested types in it.
More concretely, this is how you do it:
declare module a
{
class b
{
}
module b
{
class c
{
}
}
}
var myB = new a.b();
var myC = new a.b.c();
This works as well when nesting types in typescript code with the export keyword:
export module a
{
export class b
{
}
export module b
{
export enum c
{
C1 = 1,
C2 = 2,
C3 = 3,
}
}
}
As mentioned by the user @recursive in the comments below, the order of declaration is important. So the class definition must be located before the module with the nested types.
Solution 2:
You can use namespace/class merging to get an equivalent effect to nested classes. This example is adapted from Chapter 1 of Pro TypeScript.
You perform merging with a class and a namespace, or with a function and a namespace.
In all cases, the namespace must appear after the class or function for the merge to work.
Adapted example:
class Outer {
}
namespace Outer {
export class Mid {
}
export module Mid {
export class Inner {
}
}
}
var a = new Outer();
var b = new Outer.Mid();
var x = new Outer.Mid.Inner();
Solution 3:
As of 2016, I guess this is easier:
class A {
static B = class { }
}
var a = new A();
var b = new A.B();