/**
 * XOR for some properties applied to a type
 * (XOR is one of these but not both or neither)
 *
 * Usage: OneOf<typeToExtend, one | but | not | multiple | of | these | are | required>
 *
 * To require aria-label or aria-labelledby but not both
 * Example: OneOf<Type, 'aria-label' | 'aria-labelledby'>
 */
export type OneOf<T, K extends keyof T> = Omit<T, K> & {
    [k in K]: Pick<Required<T>, k> & {
        [k1 in Exclude<K, k>]?: never;
    };
}[K];
export interface CommonArgs {
    id?: string;
    className?: string;
    'aria-label'?: string;
    'data-test-subj'?: string;
}
/**
 * Wraps Object.keys with proper typescript definition of the resulting array
 */
export declare function keysOf<T extends Record<string, unknown>, K extends keyof T>(obj: T): K[];
/**
 * Returns member keys in U not present in T set to never
 * T = { 'one', 'two', 'three' }
 * U = { 'three', 'four', 'five' }
 * returns { 'four': never, 'five': never }
 */
export type DisambiguateSet<T, U> = {
    [P in Exclude<keyof T, keyof U>]?: never;
};
/**
 * Allow either T or U, preventing any additional keys of the other type from being present
 */
export type ExclusiveUnion<T, U> = T | U extends Record<string, unknown> ? (DisambiguateSet<T, U> & U) | (DisambiguateSet<U, T> & T) : T | U;
type UnionKeys<T> = T extends any ? keyof T : never;
export type DistributivePick<T, K extends UnionKeys<T>> = T extends any ? Pick<T, Extract<keyof T, K>> : never;
export type DistributiveOmit<T, K extends UnionKeys<T>> = T extends any ? Omit<T, Extract<keyof T, K>> : never;
export {};
//# sourceMappingURL=common.d.ts.map