import 'reflect-metadata';
import type { Combine, Type } from 'ts-gems';
import { Validator } from 'valgen';
import { OpraSchema } from '../../schema/index.js';
import type { ApiDocument } from '../api-document.js';
import type { DocumentElement } from '../common/document-element.js';
import type { ComplexType } from './complex-type.js';
import { DataType } from './data-type.js';
import type { MappedType } from './mapped-type.js';
import type { MixinType } from './mixin-type.js';
import type { SimpleType } from './simple-type.js';
/**
 * @namespace UnionType
 */
export declare namespace UnionType {
    interface Metadata extends Combine<{
        kind: OpraSchema.UnionType.Kind;
        name?: string;
        types: Type[];
    }, DataType.Metadata, OpraSchema.UnionType> {
    }
    interface InitArguments extends Combine<{
        kind: OpraSchema.UnionType.Kind;
        types: (ComplexType | MappedType | MixinType | SimpleType)[];
        ctor?: Type;
    }, DataType.InitArguments, UnionType.Metadata> {
    }
    interface Options extends Combine<Pick<OpraSchema.UnionType, 'discriminator'>, DataType.Options> {
    }
}
/**
 * Type definition for UnionType
 * @class UnionType
 */
export interface UnionTypeStatic {
    /**
     * Class constructor of UnionType
     *
     * @param owner
     * @param args
     * @constructor
     */
    new (owner: DocumentElement, args: UnionType.InitArguments): UnionType;
    /**
     * Create a new mixin type from given two types
     */
    (types: (string | Type)[], options?: UnionType.Options): Type;
    prototype: UnionType;
}
/**
 * Type definition of UnionType prototype
 * @interface
 */
export interface UnionType extends UnionTypeClass {
}
/**
 * @class UnionType
 */
export declare const UnionType: UnionTypeStatic;
/**
 *
 * @class UnionType
 */
declare class UnionTypeClass extends DataType {
    readonly kind: OpraSchema.UnionType.Kind;
    readonly types: (ComplexType | MixinType | MappedType | SimpleType)[];
    readonly discriminator?: string;
    toJSON(options?: ApiDocument.ExportOptions): OpraSchema.UnionType;
    generateCodec(codec: 'encode' | 'decode', options?: DataType.GenerateCodecOptions): Validator;
    extendsFrom(): boolean;
    protected _locateBase(): UnionType | undefined;
}
export {};
