Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0e88b93

Browse files
mrazauskasDmitryMakhnev
authored andcommitted
fix(jest-mock): tweak typings to allow jest.replaceProperty() replace methods (jestjs#14008)
1 parent d876c2e commit 0e88b93

File tree

3 files changed

+25
-23
lines changed

3 files changed

+25
-23
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- `[jest-config]` Handle frozen config object ([#14054](https://github.com/facebook/jest/pull/14054))
88
- `[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))
99
- `[jest-matcher-utils]` Fix copying value of inherited getters ([#14007](https://github.com/facebook/jest/pull/14007))
10+
- `[jest-mock]` Tweak typings to allow `jest.replaceProperty()` replace methods ([#14008](https://github.com/facebook/jest/pull/14008))
1011
- `[jest-snapshot]` Fix a potential bug when not using prettier and improve performance ([#14036](https://github.com/facebook/jest/pull/14036))
1112
- `[@jest/transform]` Do not instrument `.json` modules ([#14048](https://github.com/facebook/jest/pull/14048))
1213

packages/jest-mock/__typetests__/mock-functions.test.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -497,20 +497,25 @@ expectError(
497497

498498
// replaceProperty + Replaced
499499

500-
const obj = {
501-
fn: () => {},
502-
500+
const replaceObject = {
501+
method: () => {},
503502
property: 1,
504503
};
505504

506-
expectType<Replaced<number>>(replaceProperty(obj, 'property', 1));
507-
expectType<void>(replaceProperty(obj, 'property', 1).replaceValue(1).restore());
505+
expectType<Replaced<number>>(replaceProperty(replaceObject, 'property', 1));
506+
expectType<Replaced<() => void>>(
507+
replaceProperty(replaceObject, 'method', () => {}),
508+
);
509+
expectType<void>(
510+
replaceProperty(replaceObject, 'property', 1).replaceValue(1).restore(),
511+
);
508512

509-
expectError(replaceProperty(obj, 'invalid', 1));
510-
expectError(replaceProperty(obj, 'property', 'not a number'));
511-
expectError(replaceProperty(obj, 'fn', () => {}));
513+
expectError(replaceProperty(replaceObject, 'invalid', 1));
514+
expectError(replaceProperty(replaceObject, 'property', 'not a number'));
512515

513-
expectError(replaceProperty(obj, 'property', 1).replaceValue('not a number'));
516+
expectError(
517+
replaceProperty(replaceObject, 'property', 1).replaceValue('not a number'),
518+
);
514519

515520
interface ComplexObject {
516521
numberOrUndefined: number | undefined;

packages/jest-mock/src/index.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -177,17 +177,13 @@ export interface Replaced<T = unknown> {
177177
* Restore property to its original value known at the time of mocking.
178178
*/
179179
restore(): void;
180-
181180
/**
182181
* Change the value of the property.
183182
*/
184183
replaceValue(value: T): this;
185184
}
186185

187-
type ReplacedPropertyRestorer<
188-
T extends object,
189-
K extends PropertyLikeKeys<T>,
190-
> = {
186+
type ReplacedPropertyRestorer<T extends object, K extends keyof T> = {
191187
(): void;
192188
object: T;
193189
property: K;
@@ -995,10 +991,10 @@ export class ModuleMocker {
995991
/**
996992
* Check whether the given property of an object has been already replaced.
997993
*/
998-
private _findReplacedProperty<
999-
T extends object,
1000-
K extends PropertyLikeKeys<T>,
1001-
>(object: T, propertyKey: K): ReplacedPropertyRestorer<T, K> | undefined {
994+
private _findReplacedProperty<T extends object, K extends keyof T>(
995+
object: T,
996+
propertyKey: K,
997+
): ReplacedPropertyRestorer<T, K> | undefined {
1002998
for (const {restore} of this._spyState) {
1003999
if (
10041000
'object' in restore &&
@@ -1328,11 +1324,11 @@ export class ModuleMocker {
13281324
return descriptor[accessType] as Mock;
13291325
}
13301326

1331-
replaceProperty<
1332-
T extends object,
1333-
K extends PropertyLikeKeys<T>,
1334-
V extends T[K],
1335-
>(object: T, propertyKey: K, value: V): Replaced<T[K]> {
1327+
replaceProperty<T extends object, K extends keyof T>(
1328+
object: T,
1329+
propertyKey: K,
1330+
value: T[K],
1331+
): Replaced<T[K]> {
13361332
if (object === undefined || object == null) {
13371333
throw new Error(
13381334
`replaceProperty could not find an object on which to replace ${String(

0 commit comments

Comments
 (0)