Skip to main content

Namespaces

Namespace rendering is disabled by default, so generated declarations remain top-level:

@Serializable
class Widget(val value: String)

fun main() {
println(KotlinTsGenerator().generate(Widget.serializer()))
}

Full example: disabled namespaces.

export interface Widget {
value: string;
}

References between descriptor namespaces are qualified so they remain valid after declarations are nested:

@Serializable
@SerialName("org.one.Parent")
class Parent(val child: Child)

@Serializable
@SerialName("org.two.Child")
class Child(val value: String)

fun main() {
val config = KotlinTsConfig(
namespaceConfig = KotlinTsConfig.NamespaceConfig.DescriptorNamePrefix,
)
println(KotlinTsGenerator(config).generate(Parent.serializer()))
}

Full example: cross-namespace references.

export namespace org {
export namespace one {
export interface Parent {
child: org.two.Child;
}
}

export namespace two {
export interface Child {
value: string;
}
}
}

Use NamespaceConfig.Static to place every generated declaration in one namespace:

@Serializable
class Widget(val value: String)

fun main() {
val config = KotlinTsConfig(
namespaceConfig = KotlinTsConfig.NamespaceConfig.Static("models"),
)
println(KotlinTsGenerator(config).generate(Widget.serializer()))
}

Full example: static namespace.

export namespace models {
export interface Widget {
value: string;
}
}

DescriptorNamePrefix converts dotted serial-name prefixes into nested namespaces:

@Serializable
@SerialName("org.example.Widget")
class Widget(val value: String)

fun main() {
val config = KotlinTsConfig(
namespaceConfig = KotlinTsConfig.NamespaceConfig.DescriptorNamePrefix,
)
println(KotlinTsGenerator(config).generate(Widget.serializer()))
}

Full example: descriptor-prefix namespaces.

export namespace org {
export namespace example {
export interface Widget {
value: string;
}
}
}