diff --git a/integration/helpers/cloudflare-dev-proxy-template/package.json b/integration/helpers/cloudflare-dev-proxy-template/package.json
index 063012112a..f756886cbc 100644
--- a/integration/helpers/cloudflare-dev-proxy-template/package.json
+++ b/integration/helpers/cloudflare-dev-proxy-template/package.json
@@ -23,8 +23,8 @@
"@react-router/dev": "workspace:*",
"@react-router/fs-routes": "workspace:*",
"@react-router/remix-routes-option-adapter": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"typescript": "^5.1.6",
"vite": "^6.1.0",
"wrangler": "^4.23.0"
diff --git a/integration/helpers/rsc-parcel-framework/app/index.ts b/integration/helpers/rsc-parcel-framework/app/index.ts
index 44391bff05..fa2c5b0d29 100644
--- a/integration/helpers/rsc-parcel-framework/app/index.ts
+++ b/integration/helpers/rsc-parcel-framework/app/index.ts
@@ -1,5 +1,4 @@
import * as React from "react";
-// @ts-expect-error - no types
import { renderToReadableStream } from "react-dom/server.edge" assert { env: "react-client" };
import {
unstable_routeRSCServerRequest,
diff --git a/integration/helpers/rsc-parcel-framework/package.json b/integration/helpers/rsc-parcel-framework/package.json
index a17de0ed03..4c64443ec2 100644
--- a/integration/helpers/rsc-parcel-framework/package.json
+++ b/integration/helpers/rsc-parcel-framework/package.json
@@ -26,8 +26,8 @@
"@types/express": "^5.0.0",
"@types/node": "^22.13.1",
"@types/parcel-env": "0.0.8",
- "@types/react-dom": "^19.0.3",
- "@types/react": "^19.0.8",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"parcel": "2.15.0",
"parcel-config-react-router-experimental": "1.0.25",
"typescript": "^5.1.6"
diff --git a/integration/helpers/rsc-parcel/package.json b/integration/helpers/rsc-parcel/package.json
index 0b5c2eecac..530816eaf0 100644
--- a/integration/helpers/rsc-parcel/package.json
+++ b/integration/helpers/rsc-parcel/package.json
@@ -24,8 +24,8 @@
"@types/express": "^5.0.0",
"@types/node": "^22.13.1",
"@types/parcel-env": "0.0.8",
- "@types/react-dom": "^19.0.3",
- "@types/react": "^19.0.8",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"browserify-zlib": "^0.2.0",
"buffer": "^5.5.0||^6.0.0",
"events": "^3.1.0",
diff --git a/integration/helpers/rsc-parcel/src/browser.tsx b/integration/helpers/rsc-parcel/src/browser.tsx
index d0c02387d1..30e5453467 100644
--- a/integration/helpers/rsc-parcel/src/browser.tsx
+++ b/integration/helpers/rsc-parcel/src/browser.tsx
@@ -28,7 +28,6 @@ setServerCallback(
// Get and decode the initial server payload
createFromReadableStream(getRSCStream()).then((payload: RSCPayload) => {
- // @ts-expect-error - on 18 types, requires 19.
startTransition(async () => {
const formState =
payload.type === "render" ? await payload.formState : undefined;
diff --git a/integration/helpers/rsc-parcel/src/prerender.tsx b/integration/helpers/rsc-parcel/src/prerender.tsx
index a56e426254..4de1a82ae5 100644
--- a/integration/helpers/rsc-parcel/src/prerender.tsx
+++ b/integration/helpers/rsc-parcel/src/prerender.tsx
@@ -1,4 +1,3 @@
-// @ts-expect-error - no types for this yet
import { renderToReadableStream as renderHTMLToReadableStream } from "react-dom/server.edge";
import {
unstable_routeRSCServerRequest as routeRSCServerRequest,
@@ -29,6 +28,7 @@ export async function prerender(
,
{
bootstrapScriptContent,
+ // @ts-expect-error - no types for this yet
formState,
},
);
diff --git a/integration/helpers/rsc-vite-framework/package.json b/integration/helpers/rsc-vite-framework/package.json
index e9a983b046..749e07ee6d 100644
--- a/integration/helpers/rsc-vite-framework/package.json
+++ b/integration/helpers/rsc-vite-framework/package.json
@@ -16,8 +16,8 @@
"@react-router/fs-routes": "workspace:*",
"@types/express": "^5.0.0",
"@types/node": "^22.13.1",
- "@types/react": "^19.1.8",
- "@types/react-dom": "^19.1.6",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"@vanilla-extract/css": "^1.17.4",
"@vanilla-extract/vite-plugin": "^5.1.1",
"@vitejs/plugin-react": "^4.5.2",
diff --git a/integration/helpers/rsc-vite/package.json b/integration/helpers/rsc-vite/package.json
index 36fa88cc8b..a62e5f3ceb 100644
--- a/integration/helpers/rsc-vite/package.json
+++ b/integration/helpers/rsc-vite/package.json
@@ -10,12 +10,12 @@
"typecheck": "tsc"
},
"devDependencies": {
- "@vitejs/plugin-rsc": "0.4.24",
"@types/express": "^5.0.0",
"@types/node": "^22.13.1",
- "@types/react": "^19.1.8",
- "@types/react-dom": "^19.1.6",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"@vitejs/plugin-react": "^4.5.2",
+ "@vitejs/plugin-rsc": "0.4.24",
"typescript": "^5.1.6",
"vite": "^6.2.0"
},
diff --git a/integration/helpers/rsc-vite/src/entry.ssr.tsx b/integration/helpers/rsc-vite/src/entry.ssr.tsx
index 9301988a6d..ead347e933 100644
--- a/integration/helpers/rsc-vite/src/entry.ssr.tsx
+++ b/integration/helpers/rsc-vite/src/entry.ssr.tsx
@@ -1,5 +1,4 @@
import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr";
-// @ts-expect-error
import * as ReactDomServer from "react-dom/server.edge";
import {
unstable_RSCStaticRouter as RSCStaticRouter,
diff --git a/integration/helpers/vite-5-template/package.json b/integration/helpers/vite-5-template/package.json
index 859249cab7..e29fad5e4f 100644
--- a/integration/helpers/vite-5-template/package.json
+++ b/integration/helpers/vite-5-template/package.json
@@ -27,8 +27,8 @@
"@react-router/dev": "workspace:*",
"@react-router/fs-routes": "workspace:*",
"@react-router/remix-routes-option-adapter": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"eslint": "^8.38.0",
"typescript": "^5.1.6",
"vite": "^5.1.0",
diff --git a/integration/helpers/vite-6-template/package.json b/integration/helpers/vite-6-template/package.json
index 14cb1cb07f..3f2cd1502f 100644
--- a/integration/helpers/vite-6-template/package.json
+++ b/integration/helpers/vite-6-template/package.json
@@ -27,8 +27,8 @@
"@react-router/dev": "workspace:*",
"@react-router/fs-routes": "workspace:*",
"@react-router/remix-routes-option-adapter": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"eslint": "^8.38.0",
"typescript": "^5.1.6",
"vite": "^6.1.0",
diff --git a/integration/helpers/vite-7-beta-template/package.json b/integration/helpers/vite-7-beta-template/package.json
index f0b9b5ce3f..e3aa6dde92 100644
--- a/integration/helpers/vite-7-beta-template/package.json
+++ b/integration/helpers/vite-7-beta-template/package.json
@@ -27,8 +27,8 @@
"@react-router/dev": "workspace:*",
"@react-router/fs-routes": "workspace:*",
"@react-router/remix-routes-option-adapter": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"eslint": "^8.38.0",
"typescript": "^5.1.6",
"vite": "7.0.0-beta.0",
diff --git a/integration/helpers/vite-plugin-cloudflare-template/package.json b/integration/helpers/vite-plugin-cloudflare-template/package.json
index 7d9afd57d2..9cc779e75f 100644
--- a/integration/helpers/vite-plugin-cloudflare-template/package.json
+++ b/integration/helpers/vite-plugin-cloudflare-template/package.json
@@ -23,8 +23,8 @@
"@react-router/dev": "workspace:*",
"@react-router/fs-routes": "workspace:*",
"@types/node": "^20.0.0",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"eslint": "^8.38.0",
"typescript": "^5.1.6",
"vite": "^6.1.0",
diff --git a/integration/helpers/vite-rolldown-template/package.json b/integration/helpers/vite-rolldown-template/package.json
index d02d6f0012..3d467c70cd 100644
--- a/integration/helpers/vite-rolldown-template/package.json
+++ b/integration/helpers/vite-rolldown-template/package.json
@@ -27,8 +27,8 @@
"@react-router/dev": "workspace:*",
"@react-router/fs-routes": "workspace:*",
"@react-router/remix-routes-option-adapter": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"cross-env": "^7.0.3",
"eslint": "^8.38.0",
"typescript": "^5.1.6",
diff --git a/package.json b/package.json
index e3d3ab95af..5b4884ccff 100644
--- a/package.json
+++ b/package.json
@@ -42,9 +42,6 @@
},
"packageManager": "pnpm@9.10.0",
"resolutions": {
- "@types/react": "^18.2.18",
- "@types/react-dom": "^18.2.7",
- "@types/react-test-renderer": "^18.3.1",
"jsdom": "22.1.0"
},
"dependencies": {
@@ -59,9 +56,9 @@
"@remix-run/changelog-github": "^0.0.5",
"@types/jest": "^29.5.4",
"@types/jsdom": "^21.1.1",
- "@types/react": "^19.0.12",
- "@types/react-dom": "^19.0.4",
- "@types/react-test-renderer": "^19.0.0",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
+ "@types/react-test-renderer": "^19.1.0",
"@typescript-eslint/eslint-plugin": "^7.5.0",
"@typescript-eslint/parser": "^7.5.0",
"babel-jest": "^29.7.0",
diff --git a/packages/react-router/lib/components.tsx b/packages/react-router/lib/components.tsx
index 397ce2cb9e..d76365e018 100644
--- a/packages/react-router/lib/components.tsx
+++ b/packages/react-router/lib/components.tsx
@@ -270,7 +270,7 @@ export interface RouterProviderProps {
* - If you are rendering in a non-DOM environment, you can import
* `RouterProvider` from `react-router` and ignore this prop
*/
- flushSync?: (fn: () => unknown) => undefined;
+ flushSync?: (fn: () => R) => R;
/**
* An error handler function that will be called for any loader/action/render
* errors that are encountered in your application. This is useful for
@@ -654,7 +654,7 @@ export function MemoryRouter({
initialEntries,
initialIndex,
}: MemoryRouterProps): React.ReactElement {
- let historyRef = React.useRef();
+ let historyRef = React.useRef(undefined);
if (historyRef.current == null) {
historyRef.current = createMemoryHistory({
initialEntries,
@@ -1541,8 +1541,8 @@ export function createRoutesFromChildren(
): RouteObject[] {
let routes: RouteObject[] = [];
- React.Children.forEach(children, (element, index) => {
- if (!React.isValidElement(element)) {
+ React.Children.forEach(children, (element, index) => {
+ if (!React.isValidElement(element)) {
// Ignore non-elements. This allows people to more easily inline
// conditionals in their route config.
return;
diff --git a/packages/react-router/lib/dom/lib.tsx b/packages/react-router/lib/dom/lib.tsx
index c3171516f6..a13d166edb 100644
--- a/packages/react-router/lib/dom/lib.tsx
+++ b/packages/react-router/lib/dom/lib.tsx
@@ -904,7 +904,7 @@ export function BrowserRouter({
children,
window,
}: BrowserRouterProps) {
- let historyRef = React.useRef();
+ let historyRef = React.useRef(undefined);
if (historyRef.current == null) {
historyRef.current = createBrowserHistory({ window, v5Compat: true });
}
@@ -969,7 +969,7 @@ export interface HashRouterProps {
* for client-side routing.
*/
export function HashRouter({ basename, children, window }: HashRouterProps) {
- let historyRef = React.useRef();
+ let historyRef = React.useRef(undefined);
if (historyRef.current == null) {
historyRef.current = createHashHistory({ window, v5Compat: true });
}
diff --git a/packages/react-router/lib/dom/ssr/components.tsx b/packages/react-router/lib/dom/ssr/components.tsx
index 85271fecf8..6fc8ae6f83 100644
--- a/packages/react-router/lib/dom/ssr/components.tsx
+++ b/packages/react-router/lib/dom/ssr/components.tsx
@@ -104,7 +104,7 @@ interface PrefetchHandlers {
export function usePrefetchBehavior(
prefetch: PrefetchBehavior,
theirElementProps: PrefetchHandlers,
-): [boolean, React.RefObject, PrefetchHandlers] {
+): [boolean, React.RefObject, PrefetchHandlers] {
let frameworkContext = React.useContext(FrameworkContext);
let [maybePrefetch, setMaybePrefetch] = React.useState(false);
let [shouldPrefetch, setShouldPrefetch] = React.useState(false);
diff --git a/packages/react-router/lib/dom/ssr/routes-test-stub.tsx b/packages/react-router/lib/dom/ssr/routes-test-stub.tsx
index a41dd8612c..485fcd0a20 100644
--- a/packages/react-router/lib/dom/ssr/routes-test-stub.tsx
+++ b/packages/react-router/lib/dom/ssr/routes-test-stub.tsx
@@ -125,8 +125,9 @@ export function createRoutesStub(
hydrationData,
future,
}: RoutesTestStubProps) {
- let routerRef = React.useRef>();
- let frameworkContextRef = React.useRef();
+ let routerRef =
+ React.useRef>(undefined);
+ let frameworkContextRef = React.useRef(undefined);
if (routerRef.current == null) {
frameworkContextRef.current = {
diff --git a/packages/react-router/lib/router/router.ts b/packages/react-router/lib/router/router.ts
index 14f6fbad53..1424b642b9 100644
--- a/packages/react-router/lib/router/router.ts
+++ b/packages/react-router/lib/router/router.ts
@@ -3557,7 +3557,7 @@ export function createStaticHandler(
skipLoaderErrorBubbling,
skipRevalidation,
dataStrategy,
- generateMiddlewareResponse: generateMiddlewareResponse,
+ generateMiddlewareResponse,
}: Parameters[1] = {},
): Promise {
let url = new URL(request.url);
@@ -3831,7 +3831,7 @@ export function createStaticHandler(
routeId,
requestContext,
dataStrategy,
- generateMiddlewareResponse: generateMiddlewareResponse,
+ generateMiddlewareResponse,
}: Parameters[1] = {},
): Promise {
let url = new URL(request.url);
diff --git a/packages/react-router/lib/rsc/browser.tsx b/packages/react-router/lib/rsc/browser.tsx
index 1d15916633..52bd1f9844 100644
--- a/packages/react-router/lib/rsc/browser.tsx
+++ b/packages/react-router/lib/rsc/browser.tsx
@@ -154,7 +154,7 @@ export function createCallServer({
if (payload.rerender) {
React.startTransition(
- // @ts-expect-error - We have old react types that don't know this can be async
+ //
async () => {
const rerender = await payload.rerender;
if (!rerender) return;
diff --git a/playground/framework-express/package.json b/playground/framework-express/package.json
index c0288d54a4..3ea7d03c6e 100644
--- a/playground/framework-express/package.json
+++ b/playground/framework-express/package.json
@@ -26,8 +26,8 @@
"@types/compression": "^1.7.5",
"@types/express": "^4.17.20",
"@types/morgan": "^1.9.9",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"cross-env": "^7.0.3",
"typescript": "^5.1.6",
"vite": "^6.1.0",
diff --git a/playground/framework-rolldown-vite/package.json b/playground/framework-rolldown-vite/package.json
index 32d5acafd8..c0ef81c373 100644
--- a/playground/framework-rolldown-vite/package.json
+++ b/playground/framework-rolldown-vite/package.json
@@ -21,8 +21,8 @@
},
"devDependencies": {
"@react-router/dev": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"typescript": "^5.1.6",
"vite": "npm:rolldown-vite@6.3.0-beta.3",
"vite-tsconfig-paths": "^4.2.1"
diff --git a/playground/framework-spa/package.json b/playground/framework-spa/package.json
index fc3661c9f2..aa77b0f62e 100644
--- a/playground/framework-spa/package.json
+++ b/playground/framework-spa/package.json
@@ -19,8 +19,8 @@
},
"devDependencies": {
"@react-router/dev": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"typescript": "^5.1.6",
"vite": "^6.1.0",
"vite-tsconfig-paths": "^4.2.1"
diff --git a/playground/framework-vite-5/package.json b/playground/framework-vite-5/package.json
index b63e03428d..fce4e6b1f5 100644
--- a/playground/framework-vite-5/package.json
+++ b/playground/framework-vite-5/package.json
@@ -20,8 +20,8 @@
},
"devDependencies": {
"@react-router/dev": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"typescript": "^5.1.6",
"vite": "^5.1.0",
"vite-tsconfig-paths": "^4.2.1"
diff --git a/playground/framework-vite-7-beta/package.json b/playground/framework-vite-7-beta/package.json
index 4a72eb7f94..2cfd57ec1b 100644
--- a/playground/framework-vite-7-beta/package.json
+++ b/playground/framework-vite-7-beta/package.json
@@ -20,8 +20,8 @@
},
"devDependencies": {
"@react-router/dev": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"typescript": "^5.1.6",
"vite": "7.0.0-beta.0",
"vite-tsconfig-paths": "^4.2.1"
diff --git a/playground/framework/package.json b/playground/framework/package.json
index c24feaa33e..6d8d181579 100644
--- a/playground/framework/package.json
+++ b/playground/framework/package.json
@@ -20,8 +20,8 @@
},
"devDependencies": {
"@react-router/dev": "workspace:*",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"typescript": "^5.1.6",
"vite": "^6.1.0",
"vite-tsconfig-paths": "^4.2.1"
diff --git a/playground/middleware/package.json b/playground/middleware/package.json
index 1a4777c858..e2baf44648 100644
--- a/playground/middleware/package.json
+++ b/playground/middleware/package.json
@@ -30,8 +30,8 @@
"@types/express-serve-static-core": "^5.0.6",
"@types/morgan": "^1.9.9",
"@types/node": "^20.0.0",
- "@types/react": "^18.2.20",
- "@types/react-dom": "^18.2.7",
+ "@types/react": "^19.1.11",
+ "@types/react-dom": "^19.1.8",
"tsx": "^4.19.3",
"typescript": "^5.1.6",
"vite": "^6.0.0",
diff --git a/playground/rsc-parcel-framework/app/routes/_index/route.tsx b/playground/rsc-parcel-framework/app/routes/_index/route.tsx
index 1cb58e8142..dbfd258bb8 100644
--- a/playground/rsc-parcel-framework/app/routes/_index/route.tsx
+++ b/playground/rsc-parcel-framework/app/routes/_index/route.tsx
@@ -12,7 +12,6 @@ export function ServerComponent({ loaderData }: Route.ComponentProps) {
Home
This is the home page.
loaderData: {loaderData}
- {/* @ts-expect-error React types for the repo are set to v18 */}
diff --git a/playground/rsc-parcel-framework/app/routes/optimistic/form.tsx b/playground/rsc-parcel-framework/app/routes/optimistic/form.tsx
index b2816110e5..8b0b859955 100644
--- a/playground/rsc-parcel-framework/app/routes/optimistic/form.tsx
+++ b/playground/rsc-parcel-framework/app/routes/optimistic/form.tsx
@@ -1,7 +1,6 @@
"use client";
import {
- // @ts-expect-error React types for the repo are set to v18
useOptimistic,
} from "react";
import { useHydrated } from "remix-utils/use-hydrated";
@@ -17,13 +16,11 @@ export function ToggleLikedForm({
const [optimisticLiked, setOptimisticLiked] = useOptimistic(liked);
const toggleLikedActionOptimistic = async () => {
- // @ts-expect-error React types for the repo are set to v18
setOptimisticLiked((liked) => !liked);
await toggleLikedAction();
};
return (
- // @ts-expect-error React types for the repo are set to v18