diff --git a/CHANGELOG.md b/CHANGELOG.md index 79a573bb83d8..24b13c9192d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - `[jest-config]` Handle frozen config object ([#14054](https://github.com/facebook/jest/pull/14054)) - `[jest-environment-jsdom, jest-environment-node]` Fix assignment of `customExportConditions` via `testEnvironmentOptions` when custom env subclass defines a default value ([#13989](https://github.com/facebook/jest/pull/13989)) - `[jest-matcher-utils]` Fix copying value of inherited getters ([#14007](https://github.com/facebook/jest/pull/14007)) +- `[jest-mock]` Tweak typings to allow `jest.replaceProperty()` replace methods ([#14008](https://github.com/facebook/jest/pull/14008)) - `[jest-snapshot]` Fix a potential bug when not using prettier and improve performance ([#14036](https://github.com/facebook/jest/pull/14036)) - `[@jest/transform]` Do not instrument `.json` modules ([#14048](https://github.com/facebook/jest/pull/14048)) diff --git a/packages/jest-mock/__typetests__/mock-functions.test.ts b/packages/jest-mock/__typetests__/mock-functions.test.ts index a1c2157787ab..039469ae9c34 100644 --- a/packages/jest-mock/__typetests__/mock-functions.test.ts +++ b/packages/jest-mock/__typetests__/mock-functions.test.ts @@ -497,20 +497,25 @@ expectError( // replaceProperty + Replaced -const obj = { - fn: () => {}, - +const replaceObject = { + method: () => {}, property: 1, }; -expectType>(replaceProperty(obj, 'property', 1)); -expectType(replaceProperty(obj, 'property', 1).replaceValue(1).restore()); +expectType>(replaceProperty(replaceObject, 'property', 1)); +expectType void>>( + replaceProperty(replaceObject, 'method', () => {}), +); +expectType( + replaceProperty(replaceObject, 'property', 1).replaceValue(1).restore(), +); -expectError(replaceProperty(obj, 'invalid', 1)); -expectError(replaceProperty(obj, 'property', 'not a number')); -expectError(replaceProperty(obj, 'fn', () => {})); +expectError(replaceProperty(replaceObject, 'invalid', 1)); +expectError(replaceProperty(replaceObject, 'property', 'not a number')); -expectError(replaceProperty(obj, 'property', 1).replaceValue('not a number')); +expectError( + replaceProperty(replaceObject, 'property', 1).replaceValue('not a number'), +); interface ComplexObject { numberOrUndefined: number | undefined; diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index 8456c1312ac7..6801429f1626 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -177,17 +177,13 @@ export 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; } -type ReplacedPropertyRestorer< - T extends object, - K extends PropertyLikeKeys, -> = { +type ReplacedPropertyRestorer = { (): void; object: T; property: K; @@ -995,10 +991,10 @@ export class ModuleMocker { /** * Check whether the given property of an object has been already replaced. */ - private _findReplacedProperty< - T extends object, - K extends PropertyLikeKeys, - >(object: T, propertyKey: K): ReplacedPropertyRestorer | undefined { + private _findReplacedProperty( + object: T, + propertyKey: K, + ): ReplacedPropertyRestorer | undefined { for (const {restore} of this._spyState) { if ( 'object' in restore && @@ -1328,11 +1324,11 @@ export class ModuleMocker { return descriptor[accessType] as Mock; } - replaceProperty< - T extends object, - K extends PropertyLikeKeys, - V extends T[K], - >(object: T, propertyKey: K, value: V): Replaced { + replaceProperty( + object: T, + propertyKey: K, + value: T[K], + ): Replaced { if (object === undefined || object == null) { throw new Error( `replaceProperty could not find an object on which to replace ${String(