diff --git a/packages/react-dom/src/__tests__/ReactDOMFiberAsync-test.js b/packages/react-dom/src/__tests__/ReactDOMFiberAsync-test.js
index ef2873a80bd7f..79a7351f57f37 100644
--- a/packages/react-dom/src/__tests__/ReactDOMFiberAsync-test.js
+++ b/packages/react-dom/src/__tests__/ReactDOMFiberAsync-test.js
@@ -132,7 +132,7 @@ describe('ReactDOMFiberAsync', () => {
it('flushSync logs an error if already performing work', () => {
class Component extends React.Component {
componentDidUpdate() {
- ReactDOM.flushSync(() => {});
+ ReactDOM.flushSync();
}
render() {
return null;
diff --git a/packages/react-noop-renderer/src/createReactNoop.js b/packages/react-noop-renderer/src/createReactNoop.js
index 5ea510d73d6ea..652f32521c249 100644
--- a/packages/react-noop-renderer/src/createReactNoop.js
+++ b/packages/react-noop-renderer/src/createReactNoop.js
@@ -913,10 +913,7 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
}
},
- flushSync(fn: () => mixed) {
- NoopRenderer.flushSync(fn);
- },
-
+ flushSync: NoopRenderer.flushSync,
flushPassiveEffects: NoopRenderer.flushPassiveEffects,
// Logs the current state of the tree.
diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js
index cede27655a52a..065d17fcc7533 100644
--- a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js
+++ b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js
@@ -1093,10 +1093,13 @@ export function discreteUpdates(
}
}
-export function flushSyncWithoutWarningIfAlreadyRendering(
- fn: A => R,
- a: A,
-): R {
+// Overload the definition to the two valid signatures.
+// Warning, this opts-out of checking the function body.
+declare function flushSyncWithoutWarningIfAlreadyRendering(fn: () => R): R;
+// eslint-disable-next-line no-redeclare
+declare function flushSyncWithoutWarningIfAlreadyRendering(): void;
+// eslint-disable-next-line no-redeclare
+export function flushSyncWithoutWarningIfAlreadyRendering(fn) {
// In legacy mode, we flush pending passive effects at the beginning of the
// next event, not at the end of the previous one.
if (
@@ -1116,9 +1119,9 @@ export function flushSyncWithoutWarningIfAlreadyRendering(
ReactCurrentBatchConfig.transition = 0;
setCurrentUpdatePriority(DiscreteEventPriority);
if (fn) {
- return fn(a);
+ return fn();
} else {
- return (undefined: $FlowFixMe);
+ return undefined;
}
} finally {
setCurrentUpdatePriority(previousPriority);
@@ -1133,7 +1136,13 @@ export function flushSyncWithoutWarningIfAlreadyRendering(
}
}
-export function flushSync(fn: A => R, a: A): R {
+// Overload the definition to the two valid signatures.
+// Warning, this opts-out of checking the function body.
+declare function flushSync(fn: () => R): R;
+// eslint-disable-next-line no-redeclare
+declare function flushSync(): void;
+// eslint-disable-next-line no-redeclare
+export function flushSync(fn) {
if (__DEV__) {
if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
console.error(
@@ -1143,7 +1152,7 @@ export function flushSync(fn: A => R, a: A): R {
);
}
}
- return flushSyncWithoutWarningIfAlreadyRendering(fn, a);
+ return flushSyncWithoutWarningIfAlreadyRendering(fn);
}
export function flushControlled(fn: () => mixed): void {
diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js
index 0bba7217b1fdb..710e853ce4fd7 100644
--- a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js
+++ b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js
@@ -1093,10 +1093,13 @@ export function discreteUpdates(
}
}
-export function flushSyncWithoutWarningIfAlreadyRendering(
- fn: A => R,
- a: A,
-): R {
+// Overload the definition to the two valid signatures.
+// Warning, this opts-out of checking the function body.
+declare function flushSyncWithoutWarningIfAlreadyRendering(fn: () => R): R;
+// eslint-disable-next-line no-redeclare
+declare function flushSyncWithoutWarningIfAlreadyRendering(): void;
+// eslint-disable-next-line no-redeclare
+export function flushSyncWithoutWarningIfAlreadyRendering(fn) {
// In legacy mode, we flush pending passive effects at the beginning of the
// next event, not at the end of the previous one.
if (
@@ -1116,9 +1119,9 @@ export function flushSyncWithoutWarningIfAlreadyRendering(
ReactCurrentBatchConfig.transition = 0;
setCurrentUpdatePriority(DiscreteEventPriority);
if (fn) {
- return fn(a);
+ return fn();
} else {
- return (undefined: $FlowFixMe);
+ return undefined;
}
} finally {
setCurrentUpdatePriority(previousPriority);
@@ -1133,7 +1136,13 @@ export function flushSyncWithoutWarningIfAlreadyRendering(
}
}
-export function flushSync(fn: A => R, a: A): R {
+// Overload the definition to the two valid signatures.
+// Warning, this opts-out of checking the function body.
+declare function flushSync(fn: () => R): R;
+// eslint-disable-next-line no-redeclare
+declare function flushSync(): void;
+// eslint-disable-next-line no-redeclare
+export function flushSync(fn) {
if (__DEV__) {
if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
console.error(
@@ -1143,7 +1152,7 @@ export function flushSync(fn: A => R, a: A): R {
);
}
}
- return flushSyncWithoutWarningIfAlreadyRendering(fn, a);
+ return flushSyncWithoutWarningIfAlreadyRendering(fn);
}
export function flushControlled(fn: () => mixed): void {
diff --git a/packages/react-test-renderer/src/ReactTestRenderer.js b/packages/react-test-renderer/src/ReactTestRenderer.js
index 60e02766dc9dd..39c288014884d 100644
--- a/packages/react-test-renderer/src/ReactTestRenderer.js
+++ b/packages/react-test-renderer/src/ReactTestRenderer.js
@@ -536,9 +536,7 @@ function create(element: React$Element, options: TestRendererOptions) {
return getPublicRootInstance(root);
},
- unstable_flushSync(fn: () => T): T {
- return flushSync(fn);
- },
+ unstable_flushSync: flushSync,
};
Object.defineProperty(