facebook/react · error · Error
Expected overrideSuspense() to not get called for earlier Re
Error message
Expected overrideSuspense() to not get called for earlier React versions.
What it means
overrideSuspense(id, forceFallback) powers the 'toggle suspend' control on Suspense boundaries. It requires the renderer to expose setSuspenseHandler and scheduleUpdate (React 16.9+); on older React, DevTools has no API to force a boundary to show its fallback, so calling this throws immediately. The stock UI hides the control via supportsTogglingSuspense (renderer.js:452-454, also declared false by the legacy and flight backends).
Source
Thrown at packages/react-devtools-shared/src/backend/fiber/renderer.js:7512
function shouldSuspendFiberAlwaysFalse() {
return false;
}
const forceFallbackForFibers = new Set<Fiber>();
function shouldSuspendFiberAccordingToSet(fiber: Fiber): boolean {
return (
forceFallbackForFibers.has(fiber) ||
(fiber.alternate !== null && forceFallbackForFibers.has(fiber.alternate))
);
}
function overrideSuspense(id: number, forceFallback: boolean) {
if (
typeof setSuspenseHandler !== 'function' ||
typeof scheduleUpdate !== 'function'
) {
throw new Error(
'Expected overrideSuspense() to not get called for earlier React versions.',
);
}
const devtoolsInstance = idToDevToolsInstanceMap.get(id);
if (devtoolsInstance === undefined) {
return;
}
const nearestFiber = getNearestFiber(devtoolsInstance);
if (nearestFiber === null) {
return;
}
let fiber = nearestFiber;
while (fiber.tag !== SuspenseComponent) {
if (fiber.return === null) {
return;
}
fiber = fiber.return;
}View on GitHub (pinned to eafeac097b)
Solutions
- Upgrade react/react-dom to >=16.9.
- Gate the suspense toggle on inspectedElement.canToggleSuspense before sending 'overrideSuspense'.
- Reload after dependency version swaps so the hook re-inspects renderer capabilities.
- Confirm the selected renderer is the Fiber renderer (legacy/flight backends never support suspense toggling).
Example fix
// before
onClick={() => bridge.send('overrideSuspense', {id, rendererID, forceFallback: true})}
// after
const canToggleSuspense = inspectedElement?.canToggleSuspense === true;
onClick={() => canToggleSuspense && bridge.send('overrideSuspense', {id, rendererID, forceFallback: true})} Defensive patterns
Strategy: validation
Validate before calling
// gate on the backend-provided flag (renderer.js:6311-6313)
if (inspectedElement?.canToggleSuspense === true) {
bridge.send('overrideSuspense', {id, rendererID, forceFallback});
} Prevention
- Only show suspend/unsuspend controls when canToggleSuspense is true for the current element.
- Remember legacy (React 15) and flight backends declare supportsTogglingSuspense: false - never call overrideSuspense for them.
- Require React >=16.9 for suspense-toggling workflows.
When it happens
Trigger: Clicking 'Suspend'/' Unsuspend' on a Suspense boundary on a page running React <16.9, or a custom frontend sending the 'overrideSuspense' bridge message without checking canToggleSuspense / supportsTogglingSuspense.
Common situations: Older React 16.x apps (pre-16.9) with suspense UI explored in DevTools; test harnesses embedding react-devtools-shared against pinned legacy renderers; HMR downgrades of react-dom.
Related errors
- Expected overrideSuspenseMilestone() to not get called for e
- Expected overrideError() to not get called for earlier React
- The should not be any remaining suspense node children if th
- There should always be an Offscreen Fiber child in a hydrate
- A dehydrated Suspense node should not have a content Fiber.
AI-assisted analysis of facebook/react@eafeac097b (2026-08-21).
Data as JSON: /api/errors/6a9eab071d84a888.
Report an issue: GitHub.