You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js集成New Relic浏览器代理遇TypeScript类型错误求解

解决Next.js _document.tsx集成New Relic的TypeScript类型错误

在Next.js的_document.tsx中尝试服务端注入New Relic浏览器代理时,出现TypeScript类型错误,提示browserTimingHeader不属于DocumentInitialProps类型的已知属性。

报错信息:

Type '{ browserTimingHeader: any; html: string; head?: JSX.Element[]; styles?: JSX.Element | ReactElement<any, string | JSXElementConstructor<any>>[] | ReactFragment; }' is not assignable to type 'DocumentInitialProps'. Object literal may only specify known properties, and 'browserTimingHeader' does not exist in type 'DocumentInitialProps'.ts(2322)

解决方案

Next.js默认的DocumentInitialProps类型未定义browserTimingHeader字段,以下是两种可行的修复方式:

方法1:扩展Document的Props类型(推荐)

自定义继承自DocumentInitialProps的类型,添加browserTimingHeader字段,同时为MyDocument类指定泛型参数,实现类型安全:

/* eslint-disable @typescript-eslint/no-var-requires */
// pages/_document.tsx
const newrelic = require("newrelic");
import Document, {
  DocumentContext,
  DocumentInitialProps,
  Html,
  Head,
  Main,
  NextScript,
} from "next/document";
import type { ReactElement } from "react";

// 扩展默认类型,添加自定义字段
interface MyDocumentInitialProps extends DocumentInitialProps {
  browserTimingHeader: string;
}

class MyDocument extends Document<MyDocumentInitialProps> {
  static async getInitialProps(ctx: DocumentContext): Promise<MyDocumentInitialProps> {
    const initialProps = await Document.getInitialProps(ctx);

    const browserTimingHeader = newrelic.getBrowserTimingHeader({
      hasToRemoveScriptWrapper: true,
    });

    return {
      ...initialProps,
      browserTimingHeader,
    };
  }

  render() {
    return (
      <Html>
        <Head>
          {/* 注入New Relic代理脚本 */}
          <script dangerouslySetInnerHTML={{ __html: this.props.browserTimingHeader }} />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

方法2:使用类型断言(临时快速修复)

如果需要临时绕过类型检查,可通过as断言合并类型:

static async getInitialProps(ctx: DocumentContext): Promise<DocumentInitialProps> {
  const initialProps = await Document.getInitialProps(ctx);

  const browserTimingHeader = newrelic.getBrowserTimingHeader({
    hasToRemoveScriptWrapper: true,
  });

  return {
    ...initialProps,
    browserTimingHeader,
  } as DocumentInitialProps & { browserTimingHeader: string };
}

注意事项

  • 确保已正确安装newrelic包并配置服务端环境变量
  • getBrowserTimingHeader返回的是脚本字符串,需通过dangerouslySetInnerHTML注入到页面头部
  • 优先使用方法1的类型扩展方案,以获得完整的TypeScript类型校验,避免潜在问题

内容的提问来源于stack exchange,提问作者BIlly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:55:21