Custom Enums (A | B)
There's two different types of enums - enums and unions.
TypeScript enums
A TypeScript enum is essentially just an object where each key is backed by ascending integer values. Nitrogen will generate a C++ enum natively, which bridges to JS as a simple integer:
import { type HybridObject, iOS } from 'nitro-core'
enum Gender {
MALE,
FEMALE
}
@iOS(...)
export declare class Person extends HybridObject {
getGender(): Gender
}
This is efficient because MALE is the number 0, FEMALE is the number 1, and all other values are invalid.
TypeScript union
A TypeScript union is essentially just a variant of literal strings, which is only "typed" via TypeScript.
import { type HybridObject, iOS } from 'nitro-core'
type Gender = 'male' | 'female'
@iOS(...)
export declare class Person extends HybridObject {
getGender(): Gender
}
Nitrogen statically generates hashes for the strings "male" and "female" at compile-time, allowing for very efficient conversions between JS strings and native enums.
Unions need a name
A TypeScript union consisting of only literal strings needs to be aliased to a separate type so that nitrogen can generate the native enum accordingly.
import { type HybridObject, iOS } from 'nitro-core'
@iOS(...)
export declare class Person extends HybridObject {
getGender(): 'male' | 'female'
}
import { type HybridObject, iOS } from 'nitro-core'
type Gender = 'male' | 'female'
@iOS(...)
export declare class Person extends HybridObject {
getGender(): Gender
}