type Unboxed = T extends String ? string : T extends Number ? number : T extends Boolean ? boolean : T extends Symbol ? symbol : T extends BigInt ? bigint : T; type InstanceType = C extends new (...args: unknown[]) => infer T ? T : C extends StringConstructor ? string : C extends NumberConstructor ? number : C extends BooleanConstructor ? boolean : C extends SymbolConstructor ? symbol : C extends BigIntConstructor ? bigint : never; /** * Monkey patch a class with new methods, properties or static methods. * @param class The class to patch. * * @example * ```typescript * // Declaration is required to keep type safety * declare global { * interface Number { * double(): number; * } * } * patch(Number).with({ double: (n) => n * 2 }); // n :: number * (42).double(); // => 84 * ``` * * @example * ```typescript * class Holder { * constructor(public readonly value: T) {} * } * interface Holder { * readonly type: string; * } * patch(Holder).withGetter({ type: (holder) => typeof holder.value }); * new Holder(42).type; // => 'number' * ``` * * @example * ```typescript * declare global { * interface ObjectConstructor { * names(o: T): (keyof T)[]; * } * } * patch(Object).withStatic({ names: (o) => Object.keys(o) }); * Object.names({ a: 1, b: 2 }); // => ['a', 'b'] * ``` */ export declare const patch: (classType: C) => C extends | SymbolConstructor | StringConstructor | NumberConstructor | BooleanConstructor | BigIntConstructor | (new (...args: any[]) => any) ? { with: (namesAndValues: { [P in keyof InstanceType as P extends 'valueOf' ? never : InstanceType[P] extends (...args: any[]) => unknown ? P : never]?: | (InstanceType[P] extends (...args: any[]) => unknown ? ( target: Unboxed>, ...args: Parameters[P]> ) => ReturnType[P]> : never) | undefined; }) => void; withGetter: (namesAndValues: { [P_1 in keyof InstanceType as P_1 extends | 'valueOf' | 'toString' | 'toLocaleString' ? never : P_1]?: | ((target: Unboxed>) => InstanceType[P_1]) | undefined; }) => void; withStatic: (namesAndValues: { [P_2 in keyof C as P_2 extends | 'name' | 'prototype' | 'length' | 'caller' ? never : C[P_2] extends (...args: any[]) => unknown ? P_2 : never]?: C[P_2] | undefined; }) => void; } : Omit< { with: (namesAndValues: { [P in keyof InstanceType as P extends 'valueOf' ? never : InstanceType[P] extends (...args: any[]) => unknown ? P : never]?: | (InstanceType[P] extends (...args: any[]) => unknown ? ( target: Unboxed>, ...args: Parameters[P]> ) => ReturnType[P]> : never) | undefined; }) => void; withGetter: (namesAndValues: { [P_1 in keyof InstanceType as P_1 extends | 'valueOf' | 'toString' | 'toLocaleString' ? never : P_1]?: | ((target: Unboxed>) => InstanceType[P_1]) | undefined; }) => void; withStatic: (namesAndValues: { [P_2 in keyof C as P_2 extends | 'name' | 'prototype' | 'length' | 'caller' ? never : C[P_2] extends (...args: any[]) => unknown ? P_2 : never]?: C[P_2] | undefined; }) => void; }, 'with' | 'withGetter' >; export {}; //# sourceMappingURL=patch.d.ts.map