جاوااسکریپت - چگونه از res.locals در Express با تایپاسکریپت داخل Next.js استفاده کنیم


من در برنامه خود از express - next.js استفاده میکنم و مقداری پیکربندی را از سرور به مشتری از طریق res.locals منتقل میکنم، پروژه من در تایپاسکریپت است و از "@types/next": "^8.0.6" استفاده میکنم.

مشکل: تایپاسکریپت میگوید "خصوصیت 'locals' در نوع 'ServerResponse | Partial<ServerResponse>' وجود ندارد."

پاسخ مورد انتظار: - راهی برای بازنویسی "NextContext.res" یا "NextResponse" تا برابر با Express.res باشد به جای http.ServerResponse - راهی برای بازنویسی NextResponse برای افزودن locals: any | {x:strong}.

این مثال سادهشده از آنچه داریم و نحوه بازتولید آن است:

import React from 'react';
import Document, { Head, Main, NextScript } from 'next/document';

type Props = {
  locals: {};
}

export default class MyDocument extends Document<Props> {
  render() {
    const { locals } = this.props;

    return (
      <html>
        <Head>
          <ComponentUsingLocalsInfo locals={locals} />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </html>
    )
  }
}

MyDocument.getInitialProps = async (ctx) => {
  const { locals } = ctx.res;
  const initialProps = await Document.getInitialProps(ctx);

  return {
    ...initialProps,
    locals,
  }
}

پاسخ شماره ۱

برای یک راه حل سریع، این چیزی است که برای من جواب داد:

    import { Response } from 'express';

    MyDocument.getInitialProps = async (ctx) => {

        const { locals } = (ctx.res as Response);

    }

پاسخ شماره ۲

شما همیشه میتوانید یک رابط کاربری سفارشی به این صورت ایجاد کنید:

export interface Custom_Initial_Props extends Omit<NextPageContext, 'res'> {
    res: Express.Request;
}