我正在创建一个中间件;name";属性设置为NextRequest,此属性将用于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全局类型中吗?
显示我是如何根据julialves的评论解决问题的
创建.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
时,typescript会认为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()
}
注意:不要从next导入NextRequest
,否则全局类型将被导入的NextRequest
替换
import { NextRequest, NextResponse } from 'next/server'
export function middleware(req: NextRequest) {
req.name = 'Foo' // error
NextResponse.next()
}
如果您想从下一步开始使用NextRequest
,请重命名导入