合并接口时在TypeScript中覆盖`any`

时间:2019-03-26 17:12:47

标签: node.js typescript express

我正在使用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并将其完全替换?

2 个答案:

答案 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;
    };
  }
}

希望这会有所帮助!