variant

Objects created by the CandidType function Variant correspond to the Candid variant type, are inferred to be TypeScript Objects, and will be decoded into JavaScript Objects at runtime.

The shape of the object will match the object literal passed to the Variant function, however it will contain only one of the enumerated properties.

TypeScript or JavaScript:

import { Canister, Null, query, Variant } from 'azle/experimental';

const Emotion = Variant({
    Happy: Null,
    Indifferent: Null,
    Sad: Null
});

const Reaction = Variant({
    Fire: Null,
    ThumbsUp: Null,
    Emotion: Emotion
});

export default Canister({
    getReaction: query([], Reaction, () => {
        return {
            Fire: null
        };
    }),
    printReaction: query([Reaction], Reaction, (reaction) => {
        console.log(typeof reaction);
        return reaction;
    })
});

Candid:

type Emotion = variant { Sad; Indifferent; Happy };
type Reaction = variant { Emotion : Emotion; Fire; ThumbsUp };
service : () -> {
    getReaction : () -> (Reaction) query;
    printReaction : (Reaction) -> (Reaction) query;
}

dfx:

dfx canister call candid_canister printReaction '(variant { Fire })'
(variant { Fire })