import React, { ReactNode } from 'react';
import { AbilityTuple, SubjectType, AnyAbility, Generics, Abilities, IfString } from '@casl/ability';
type AbilityCanProps<T extends Abilities, Else = IfString<T, {
    do: T;
} | {
    I: T;
}>> = T extends AbilityTuple ? {
    do: T[0];
    on: T[1];
    field?: string;
} | {
    I: T[0];
    a: Extract<T[1], SubjectType>;
    field?: string;
} | {
    I: T[0];
    an: Extract<T[1], SubjectType>;
    field?: string;
} | {
    I: T[0];
    this: Exclude<T[1], SubjectType>;
    field?: string;
} : Else;
interface ExtraProps {
    not?: boolean;
    passThrough?: boolean;
}
interface CanExtraProps<T extends AnyAbility> extends ExtraProps {
    children: ReactNode | ((exposes: {
        isAllowed: boolean;
        ability: T;
        reason: string | undefined;
    }) => ReactNode);
}
export type CanProps<T extends AnyAbility> = AbilityCanProps<Generics<T>['abilities']> & CanExtraProps<T>;
declare function CanComponent<T extends AnyAbility>(props: CanProps<T>): React.ReactNode;
export declare const Can: typeof CanComponent;
export {};
