Skip to content

Automatic type generation for Next.js app router dynamic route params

License

Notifications You must be signed in to change notification settings

joulev/nextjs-route-types

Repository files navigation

nextjs-route-types

Automatic type generation for Next.js app router routes, copied from highly inspired by SvelteKit.

Screenshot of nextjs-route-types in action

Version 2 only supports Next.js 15 and after. If you want to continue using Next.js 13 or 14, use version 1.1.1 of this library.

Installation

  1. Install the package from NPM:

    npm install nextjs-route-types # npm
    yarn add nextjs-route-types # yarn
    pnpm add nextjs-route-types # pnpm
    bun add nextjs-route-types # bun
  2. Use the Next.js plugin in your Next.js config file

    const { withNextJSRouteTypes } = require("nextjs-route-types");
    
    /** @type {import("next").NextConfig} */
    const nextConfig = {
      // your Next.js configurations
    };
    
    module.exports = withNextJSRouteTypes(nextConfig);
  3. Configure tsconfig.json: Add "rootDirs": [".", ".next-types"] to your compilerOptions. This step is necessary, we need this for TypeScript to know where to look when we import from ./$types.

  4. If you use Git you might want to add .next-types to .gitignore.

Usage

In any files inside the app directory (or src/app if you use it), you can import certain types from "./$types":

// app/[dynamic]/[nested]/page.tsx
import type { PageProps } from "./$types";

export default async function Page({ params }: PageProps) {
  console.log((await params).dynamic); // string
  return <div>Hello world</div>;
}
// app/[dynamic]/[...another]/route.ts
import type { RouteHandler } from "./$types";

export const GET: RouteHandler = async (request, { params }) => {
  console.log((await params).another); // string[];
  return new Response();
};

./$types exports the following types: SearchParams, Params, DefaultProps, ErrorProps, LayoutProps, LoadingProps, NotFoundProps, PageProps, TemplateProps, RouteHandlerContext and RouteHandler.

Note Editor IntelliSense might not work and you likely have to type that import statement manually. This is a known issue that I don't know how to fix – PRs welcome.

Credits

SvelteKit for the idea of using rootDirs for this.

nextjs-routes on which the Next.js plugin part of this code is based.

About

Automatic type generation for Next.js app router dynamic route params

Topics

Resources

License

Stars

Watchers

Forks