Express + TypeScript:为response.locals 创建类型推断

Sir*_*hau 6 node.js express typescript

我想为我的response.locals. 它用于将数据附加到请求-响应周期中。

我尝试过的

// ./types/express/index.d.ts
declare global {
    declare namespace Express {
        interface Response {
            locals: {
                userId: number;
            };
        }
    }
}

Run Code Online (Sandbox Code Playgroud)
// tsconfig.json
    "compilerOptions": {
        "typeRoots": ["./types"],
    }
Run Code Online (Sandbox Code Playgroud)
myController.post("/", async (request, response) => {
     // Can't get type in my controller
    const { userId } = response.locals; // <- userId is any
Run Code Online (Sandbox Code Playgroud)

目标:为我的response.locals变量获得正确的类型推断

版本: "express": "^4.17.1", "@types/express": "^4.17.8", "typescript": "^4.5.4"

eln*_*ren 7

我们可以看到@types/express-serve-static-core/index.d.ts有一个全局命名空间,Express其中包含一些我们可以扩展的接口。其中之一是Locals:)

解决方案:

src/types.d.ts(或类似的,将其包含在 tsconfig 中,例如在“类型”字段中)

declare global {
  namespace Express {
    interface Locals {
      anything: 'here'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Hei*_*ßen 2

在没有适当的 TypeScript 背景的情况下,我能够编译以下内容(经过一些尝试和错误):

import {Request, Response} from "express";
interface Locals extends Record<string, any> {
  userId: number;
}
interface MyResponse extends Response {
  locals: Locals;
}
export function middleware(request: Request, response: MyResponse) {
  const {userId} = response.locals;
  response.end(userId);
  return userId;
}
Run Code Online (Sandbox Code Playgroud)

声明文件 ( .d.ts) 包含:

export declare function middleware(request: Request, response: MyResponse): number;
Run Code Online (Sandbox Code Playgroud)

所以number类型被正确推断出来。

当我在express.