You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Express中Request的body类型从any覆盖为unknown

如何覆盖Express TypeScript定义中Request接口的现有属性类型

要覆盖Express的Request接口现有属性类型,核心是正确利用模块扩充(Module Augmentation),而非全局命名空间的声明合并。以下是具体解决方案:

关键原因:你的写法为什么没生效

  1. Express的Request接口实际定义在express-serve-static-core模块内部,而非全局命名空间,所以declare global的写法无法覆盖模块内的接口。
  2. 第二种写法如果没有添加export {},文件会被视为全局脚本而非模块,模块扩充语法不生效。
  3. 多余的extends Record<string, unknown>对覆盖属性没有帮助,反而可能引入不必要的索引类型问题。

正确实现方式

步骤1:创建自定义声明文件

新建一个.d.ts文件(比如express-custom.d.ts),用于扩充Express的类型定义:

// 导入核心模块类型(可选,但能获得更好的类型提示)
import type * as core from "express-serve-static-core";

declare module "express-serve-static-core" {
    // 方式1:直接覆盖指定属性的类型
    interface Request {
        // 新增属性
        addition: "a" | "b";
        // 覆盖现有属性类型
        body: unknown;
        cookies: unknown;
        route: unknown;
        signedCookies: unknown;
    }

    // 方式2:修改泛型默认值(更灵活,支持按需指定类型)
    // 适合需要保留泛型能力的场景,比如某路由需要特定的body类型
    // interface Request<
    //     P = core.ParamsDictionary,
    //     ResBody = any,
    //     ReqBody = unknown, // 将默认的any改为unknown
    //     ReqQuery = core.Query,
    //     Locals extends Record<string, any> = Record<string, any>
    // > {
    //     addition: "a" | "b";
    // }
}

// 必须添加这一行,确保文件被TypeScript视为模块
export {};

步骤2:配置TypeScript识别声明文件

在tsconfig.json的include数组中加入这个声明文件,确保TypeScript能读取到:

{
    "compilerOptions": {
        // 你的其他配置
    },
    "include": [
        "src/**/*",
        "./express-custom.d.ts" // 添加这一行
    ]
}

验证效果

在业务代码中使用Request接口时,覆盖后的类型会生效:

import express from "express";
const app = express();

app.post("/test", (req, res) => {
    const add = req.addition; // 类型提示为"a" | "b"
    const body = req.body; // 类型为unknown,不再是any
    res.send("success");
});

注意事项

  • 如果使用方式2的泛型修改,你依然可以在特定场景下指定自定义类型,比如Request<{}, {}, MyCustomBodyType>。
  • 确保你的声明文件没有和其他类型定义冲突,比如不要重复定义相同属性的矛盾类型。

内容的提问来源于stack exchange,提问作者myol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:01:11