如何向 NextRequest 类型添加新属性?

2024-04-09

我正在创建一个向 NextRequest 添加“name”属性的中间件,该属性将在 API 的其他部分中使用

import { NextRequest, NextResponse } from 'next/server'

export function middleware(req: NextRequest) {
    req.name = 'Foo'

    NextResponse.next()
}

我收到这个错误Property 'name' does not exist on type 'NextRequest'

另一种方法是创建一个扩展 NextRequest 的接口,但我必须导入所有想要访问“name”属性的文件

import { NextRequest, NextResponse } from 'next/server'

interface CustomRequest extends NextRequest {
    name: string
}

export function middleware(req: CustomRequest) {
    req.name = 'Foo'

    NextResponse.next()
}

有什么方法可以将此属性添加到 NextRequest 全局类型中吗?


显示我如何根据评论解决问题胡利奥马尔维斯 https://stackoverflow.com/questions/70172177/how-to-add-a-new-property-to-nextrequest-types#comment124051104_70172177


创建一个.d.ts文件,可以使用任何名称

// global.d.ts
import { NextRequest as OriginalNextRequest } from 'next/server'

declare global {
    declare interface NextRequest extends OriginalNextRequest {
        name: string
    }
}

有必要:

  • extends OriginalNextRequest显示全部NextRequest下一个的类型

  • 重命名NextRequest导入,否则在扩展时NextRequest打字稿会认为NextRequest是您正在创建的界面,只会显示name在自动完成中

导入修改后的NextRequest

// tsconfig.json

"paths": {
    "*": ["*.d.ts"]
}

如果 .d.ts 文件位于文件夹中

"paths": {
    "*": ["types/*.d.ts"]
}

现在打字稿没有显示错误name不存在于NextRequest

import { NextResponse } from 'next/server'

export function middleware(req: NextRequest) {
    req.name = 'Foo'

    NextResponse.next()
}

NOTE:不导入NextRequest从下一个开始,否则全局类型将被替换为NextRequest从进口

import { NextRequest, NextResponse } from 'next/server'

export function middleware(req: NextRequest) {
    req.name = 'Foo' // error

    NextResponse.next()
}

如果你想使用NextRequest从下一步开始,重命名导入

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向 NextRequest 类型添加新属性? 的相关文章

随机推荐