;
  isMockFunction, R>(
    fn: (...args: P) => R,
  ): fn is Mock<(...args: P) => R>;
  isMockFunction(fn: unknown): fn is Mock;
  fn(implementation?: T): Mock;
  spyOn<
    T extends object,
    K extends PropertyLikeKeys,
    V extends Required[K],
    A extends 'get' | 'set',
  >(
    object: T,
    methodKey: K,
    accessType: A,
  ): A extends 'get'
    ? SpiedGetter
    : A extends 'set'
      ? SpiedSetter
      : never;
  spyOn<
    T extends object,
    K extends ConstructorLikeKeys | MethodLikeKeys,
    V extends Required[K],
  >(
    object: T,
    methodKey: K,
  ): V extends ClassLike | FunctionLike ? Spied : never;
  private _spyOnProperty;
  replaceProperty(
    object: T,
    propertyKey: K,
    value: T[K],
  ): Replaced;
  clearAllMocks(): void;
  resetAllMocks(): void;
  restoreAllMocks(): void;
  private _typeOf;
  mocked(
    source: T,
    options?: {
      shallow: false;
    },
  ): Mocked;
  mocked(
    source: T,
    options: {
      shallow: true;
    },
  ): MockedShallow;
}
export declare type PropertyLikeKeys = Exclude<
  keyof T,
  ConstructorLikeKeys | MethodLikeKeys
>;
declare type RejectType =
  ReturnType extends PromiseLike ? unknown : never;
export declare interface Replaced {
  /**
   * Restore property to its original value known at the time of mocking.
   */
  restore(): void;
  /**
   * Change the value of the property.
   */
  replaceValue(value: T): this;
}
export declare const replaceProperty: (
  object: T,
  propertyKey: K,
  value: T[K],
) => Replaced;
declare type ResolveType =
  ReturnType extends PromiseLike ? U : never;
export declare type Spied =
  T extends ClassLike
    ? SpiedClass
    : T extends FunctionLike
      ? SpiedFunction
      : never;
export declare type SpiedClass =
  MockInstance<(...args: ConstructorParameters) => InstanceType>;
export declare type SpiedFunction =
  MockInstance<(...args: Parameters) => ReturnType>;
export declare type SpiedGetter = MockInstance<() => T>;
export declare type SpiedSetter = MockInstance<(arg: T) => void>;
export declare const spyOn: {
  <
    T extends object,
    K extends PropertyLikeKeys,
    V extends Required[K],
    A extends 'get' | 'set',
  >(
    object: T,
    methodKey: K,
    accessType: A,
  ): A extends 'get'
    ? SpiedGetter
    : A extends 'set'
      ? SpiedSetter
      : never;
  <
    T extends object,
    K extends ConstructorLikeKeys | MethodLikeKeys,
    V extends Required[K],
  >(
    object: T,
    methodKey: K,
  ): V extends ClassLike | FunctionLike ? Spied : never;
};
export declare type UnknownClass = new (...args: Array) => unknown;
export declare type UnknownFunction = (...args: Array) => unknown;
export {};