testing.d.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334
  1. /// <reference types="jest" />
  2. declare type MockableFunction = (...args: any[]) => any;
  3. declare type MethodKeysOf<T> = {
  4. [K in keyof T]: T[K] extends MockableFunction ? K : never;
  5. }[keyof T];
  6. declare type PropertyKeysOf<T> = {
  7. [K in keyof T]: T[K] extends MockableFunction ? never : K;
  8. }[keyof T];
  9. declare type ArgumentsOf<T> = T extends (...args: infer A) => any ? A : never;
  10. declare type ConstructorArgumentsOf<T> = T extends new (...args: infer A) => any ? A : never;
  11. interface MockWithArgs<T extends MockableFunction> extends jest.MockInstance<ReturnType<T>, ArgumentsOf<T>> {
  12. new (...args: ConstructorArgumentsOf<T>): T;
  13. (...args: ArgumentsOf<T>): ReturnType<T>;
  14. }
  15. declare type MaybeMockedConstructor<T> = T extends new (...args: any[]) => infer R ? jest.MockInstance<R, ConstructorArgumentsOf<T>> : {};
  16. declare type MockedFunction<T extends MockableFunction> = MockWithArgs<T> & {
  17. [K in keyof T]: T[K];
  18. };
  19. declare type MockedFunctionDeep<T extends MockableFunction> = MockWithArgs<T> & MockedObjectDeep<T>;
  20. declare type MockedObject<T> = MaybeMockedConstructor<T> & {
  21. [K in MethodKeysOf<T>]: T[K] extends MockableFunction ? MockedFunction<T[K]> : T[K];
  22. } & {
  23. [K in PropertyKeysOf<T>]: T[K];
  24. };
  25. declare type MockedObjectDeep<T> = MaybeMockedConstructor<T> & {
  26. [K in MethodKeysOf<T>]: T[K] extends MockableFunction ? MockedFunctionDeep<T[K]> : T[K];
  27. } & {
  28. [K in PropertyKeysOf<T>]: MaybeMockedDeep<T[K]>;
  29. };
  30. export declare type MaybeMockedDeep<T> = T extends MockableFunction ? MockedFunctionDeep<T> : T extends object ? MockedObjectDeep<T> : T;
  31. export declare type MaybeMocked<T> = T extends MockableFunction ? MockedFunction<T> : T extends object ? MockedObject<T> : T;
  32. export declare function mocked<T>(item: T, deep?: false): MaybeMocked<T>;
  33. export declare function mocked<T>(item: T, deep: true): MaybeMockedDeep<T>;
  34. export {};