我正在使用Express,并且试图显式定义res.locals
。在@ types / express包中,Express.Response.locals是any
,所以我似乎无法覆盖它:
types / express / index.d.ts:
declare namespace Express {
interface Response {
locals: {
myVar: number
}
}
}
我的中间件:
import * as express from 'express'
function middleware(
req: express.Request,
res: express.Response,
next: express.nextFunction
) {
res.locals.myVar = '10' // I want this to throw a compiler error
next()
}
我希望将错误的res.locals.myVar
分配给错误,但是根据我的自动补全,res.locals
仍然是any
。
如何删除any
并将其完全替换?
答案 0 :(得分:2)
不幸的是,无法使用接口合并来覆盖任何方法。您可以对类型进行一些手术,并使用映射和条件类型替换类型:
import * as express from 'express'
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
type MyResponse = Omit<express.Response, "locals"> & {
locals: {
myVar: number
}
}
function middleware(
req: express.Request,
res: MyResponse,
next: express.NextFunction
) {
res.locals.myVar = '10' // error now
next()
}
答案 1 :(得分:1)
我最近遇到了这个问题,并设法通过在src文件夹中创建一个index.d.ts
来覆盖res.locals来解决此问题,我的实现如下所示:
declare module 'express' {
export interface Response {
locals: {
message: string;
};
}
}
希望这会有所帮助!