how to strongly type body of NextApiRequest in Nextjs

Viewed 3791

wondering how to define the type of body of an API POST Nextjs route in order to benefit from typesafety ? In the NextApiRequest, body is defined as "any" and NextApiRequest is not generic

using as force the type but this is not clean at all

running NextJs12 and typescript 4.4.4

import { NextApiRequest, NextApiResponse } from "next";

interface IBody {
  test: string;
  value: number;
}

const handler = async (
  req: NextApiRequest, <-- whish to have something here like NextApiRequest<TQuery, TBody,..>
  res: NextApiResponse
): Promise<void> => {
  const { body } = req;
  console.log(body as IBody); <--this is not safe at all

  res.status(200).json({ text: "Hello" });
};

export default handler;
1 Answers

You can use TypeScript Omit to replace the body of the request with a custom type.

type Override<T1, T2> = Omit<T1, keyof T2> & T2;
    
export type MyCustomRequest = Override<NextApiRequest, { body: MyCustomRequestBody }>
    
export type MyCustomRequestBody = {
  myCustomField: string
}
Related