/**
 * Inject an instance of the specifed type. That instance can pass down to childrens in ui relationship.
 *
 * @param classType - Type to inject
 * @param constructorArgs - Optional arguments for the constructor, by naming convention an interface should be supplied specifying the expected parameters
 * the name of the interface should follow <classType>Constructor i.e.
 * Type: HttpClient, if supporting constructor arguments an interface named: "HttpClientConstructor" should be supplied.
 *
 * E.g.:
 * Provide<HttpClientConstructor>(HttpClient,{someConstructorArg1:"",someConstructorArg2})
 */
export declare function Provide<T>(classType: any, constructorArgs?: T): any;
/**
 * Provide an instance of the specifed type. That instance will available to lower level inject it.
 *
 * @param provide - Type to inject
 * @param constructorArgs - Optional arguments for the constructor, by naming convention an interface should be supplied specifying the expected parameters
 * the name of the interface should follow <classType>Constructor i.e.
 * Type: HttpClient, if supporting constructor arguments an interface named: "HttpClientConstructor" should be supplied.
 *
 * E.g.:
 * useInject<HttpClientConstructor>(HttpClient,{someConstructorArg1:"",someConstructorArg2})
 */
export declare function useProvide<TProvide, TConstructor>(provide: TProvide, constructorArgs?: TConstructor): TProvide extends new (...args: any) => infer P ? P : TProvide extends Object ? TProvide : never;
