首页 > 解决方案 > 声明合并不适用于 express 4.17.* 请求类型

问题描述

我想向 Request 类型添加一个属性,所以我创建了一个文件夹 @types/express 并在这个文件夹中添加了包含此内容的文件 index.d.ts。

namespace Express {
  interface Request {
    user: number;
  }
}

在 VSCode 中,当我引用 时req.user,错误已经消失,它甚至显示了屏幕截图user类型number ,显示“请求”对象上的“用户”属性被正确处理

但是当我启动服务器时,我看到了这样的错误:

/home/myself/web/my-server/node_modules/ts-node/src/index.ts:434
    return new TSError(diagnosticText, diagnosticCodes)
           ^
TSError: ⨯ Unable to compile TypeScript:
src/app.ts:46:7 - error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'.

46   req.user;
         ~~~~

    at createTSError (/home/myself/web/my-server/node_modules/ts-node/src/index.ts:434:12)
    at reportTSError (/home/myself/web/my-server/node_modules/ts-node/src/index.ts:438:19)
    at getOutput (/home/myself/web/my-server/node_modules/ts-node/src/index.ts:578:36)
    at Object.compile (/home/myself/web/my-server/node_modules/ts-node/src/index.ts:775:32)
    at Module.m._compile (/home/myself/web/my-server/node_modules/ts-node/src/index.ts:858:43)
    at Module._extensions..js (internal/modules/cjs/loader.js:1220:10)
    at Object.require.extensions.<computed> [as .ts] (/home/myself/web/my-server/node_modules/ts-node/src/index.ts:861:12)
    at Module.load (internal/modules/cjs/loader.js:1049:32)
    at Function.Module._load (internal/modules/cjs/loader.js:937:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)

我将不胜感激有关如何解决它的任何想法。

ps 我对express-session模块做了同样的事情,并在界面中添加了一个counter属性Session,它完美地工作

标签: node.jstypescriptexpressdefinitelytyped

解决方案


@types/express安装后(也足够了@types/express-session),这应该可以工作:

index.d.ts

declare module '@types/express-serve-static-core' {
  interface Request {
    user?: User
  }
}

重要的部分是声明合并逻辑是其中的一部分@types/express-serve-static-core(参见https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/express-serve-static-core/index.d.ts)。


推荐阅读