Some properties of a class are optional, or nullable, or both.
If a value has a default value, then it is not required for creating an encoded message. Therefore,
it will be marked as optional using the ?:
notation.
@Serializable
class Colour(val rgb: Int = 12345)
fun main() {
val tsGenerator = KxsTsGenerator()
println(tsGenerator.generate(Colour.serializer()))
}
You can get the full code here.
export interface Colour {
rgb?: number;
}
Properties might be required, but the value can be nullable. In TypeScript that is represented with
a type union that includes null
.
@Serializable
class Colour(val rgb: Int?) // 'rgb' is required, but the value can be null
fun main() {
val tsGenerator = KxsTsGenerator()
println(tsGenerator.generate(Colour.serializer()))
}
You can get the full code here.
export interface Colour {
rgb: number | null;
}
A property can be both nullable and optional, which gives four possible options.
@Serializable
data class ContactDetails(
// nullable: ❌, optional: ❌
val name: String,
// nullable: ✅, optional: ❌
val email: String?,
// nullable: ❌, optional: ✅
val active: Boolean = true,
// nullable: ✅, optional: ✅
val phoneNumber: String? = null,
)
fun main() {
val tsGenerator = KxsTsGenerator()
println(tsGenerator.generate(ContactDetails.serializer()))
}
You can get the full code here.
export interface ContactDetails {
name: string;
email: string | null;
active?: boolean;
phoneNumber?: string | null;
}
Properties with default values can be set as required using the Kotlinx Serialization annotation,
@kotlinx.serialization.Required
.
For demonstration purposes, let's see what happens when @Required
is added to all properties.
@Serializable
data class ContactDetails(
@Required
val name: String,
@Required
val email: String?,
@Required
val active: Boolean = true,
@Required
val phoneNumber: String? = null,
)
fun main() {
val tsGenerator = KxsTsGenerator()
println(tsGenerator.generate(ContactDetails.serializer()))
}
You can get the full code here.
active
and phoneNumber
are now required properties. Note that @Required
had no effect
on name
or email
; because they do not have default values, they were already required.
export interface ContactDetails {
name: string;
email: string | null;
active: boolean;
phoneNumber: string | null;
}