扩展表达请求的定义,在打字稿中导致“类型不存在”?

时间:2020-06-03 22:39:18

标签: typescript typescript-typings

我试图在@types/express中声明的Express Request定义上添加新字段'ws',但是在运行时我遇到了错误:

src/routes/api/messages.ts:11:20 - error TS2339: Property 'ws' does not exist on type 'Request<ParamsDictionary, any, any>'

我在项目中创建了一个custom.d.ts文件:

export {};

declare global {
    namespace Express {
        interface Request {
            ws?: any;
        }
    }
}

此文件放置在src/types/tsconfig.json部分中的compilerOptions -> typeRoots中,并且文件夹依次由paths引用(仅在示例中为关键部分):

{
    "compilerOptions": {
        "node_modules/@types",
        "src/types/*"
    },
    "paths": {
      "*": [
        "node_modules/*",
        "src/types/*"
      ]
    },
}

这一切似乎都满足VS Code Typescript环境,但是在运行时失败。开发人员运行时正在使用nodemon server,内容为nodemon.json

  {
    "watch": ["src"],
    "ext": "ts",
    "ignore": ["src/**/*.spec.ts"],
    "exec": "ts-node ./src/index.ts"
  }

目前,我唯一的解决方法是按如下方式访问该字段:

const ws = (req as any).ws

我正在使用Express 4和打字稿3.8.3。

1 个答案:

答案 0 :(得分:0)

根据ts-node bug report找到了可行的解决方案:

基本上,必须使用--files选项调用ts节点。因此,从CLI:

ts-node --files src

nodemon.json

{
    "watch": ["src"],
    "ext": "ts",
    "ignore": ["src/**/*.spec.ts"],
    "exec": "ts-node --files ./src/index.ts"
}