// Type definitions for react-onclickoutside 6.7 // Project: https://github.com/Pomax/react-onclickoutside // Definitions by: Karol Janyst // Boris Sergeyev // Thomas Levy // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.8 import * as React from "react"; export {}; export interface HandleClickOutside { handleClickOutside: React.MouseEventHandler; } export interface ConfigObject { handleClickOutside?: HandleClickOutside['handleClickOutside']; excludeScrollbar?: boolean; } export interface InjectedOnClickOutProps { disableOnClickOutside(): void; enableOnClickOutside(): void; } export type WithoutInjectedClickOutProps

= Pick>; export interface AdditionalProps extends ConfigObject { disableOnClickOutside?: boolean; eventTypes?: string | string[]; outsideClickIgnoreClass?: string; preventDefault?: boolean; stopPropagation?: boolean; } export type ComponentConstructor

= React.ComponentType

; export interface ClickOutComponentClass

extends React.ComponentClass

{ new (props: P, context?: any): React.Component & HandleClickOutside; } export type OnClickOutProps

= WithoutInjectedClickOutProps

& AdditionalProps; export interface WrapperClass { new (): WrapperInstance; } export interface WrapperInstance extends React.Component>> { getInstance(): C extends typeof React.Component ? InstanceType : never; } type PropsOf = T extends ( props: infer P, context?: any ) => React.ReactElement | null // Try to infer for SFCs ? P : T extends new (props: infer P, context?: any) => React.Component // Otherwise try to infer for classes ? P : never; export default function OnClickOut< C extends ComponentConstructor

| ClickOutComponentClass

, P = PropsOf >(component: C, config?: ConfigObject): WrapperClass;