TypeScript 中的请求类型不存在属性“X”

属性在 TypeScript 中的 Request 类型上不存在

Property does not exist on type Request in TypeScript

当我们访问 Request 接口中不存在的属性时,会出现“Property does not exist on type Request”错误。

要解决该错误,请在文件中扩展 Request 接口.d.ts,在请求对象上添加您打算访问的属性。

在您的src目录中,创建一个types包含以下
index.d.ts文件的目录:

源代码/类型/index.d.ts
export {}; declare global { namespace Express { interface Request { user: string; } } }

该示例显示了如何使用类型为.named 的属性
扩展
Request
接口userstring

请注意,这在您的用例中很可能会有所不同,因此请务必调整属性名称和类型。

这是我index.ts使用该req.user属性的文件。

索引.ts
import express, { Request, Response } from 'express'; const app = express(); const port = 3445; app.get('/', (req: Request, res: Response) => { req.user = 'bobby_hadz'; // 👈️ use req.user console.log(req.user); // 👈️ use req.user res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`); });

请注意,如果使用 ts-node ,您的终端可能仍会出现错误

问题在于ts-node无法识别本地
声明文件

--files在你的ts-node命令中使用标志

要解决此问题,请--files在您的ts-node命令中使用该标志。

而不是ts-node ./src/index.ts,你应该运行
ts-node --files ./src/index.ts

我使用nodemonwith这是我
文件
ts-node的内容。nodemon.json

nodemon.json
{ "watch": ["src"], "ext": ".ts,.js", "ignore": [], "exec": "ts-node --files ./src/index.ts" }

添加--files标志后(仅在使用时才需要ts-node),重新启动服务器,您应该一切顺利。

将你的类型目录的路径添加到你的tsconfig.json文件中

如果错误仍然存​​在,请尝试将types目录
路径添加到
tsconfig.json中。

tsconfig.json文件
{ "compilerOptions": { // ... rest "typeRoots": ["./node_modules/@types", "./src/types"] } }

我们使用文件export {}中的行将index.d.ts其标记为外部模块。

模块是一个包含至少 1 个importorexport语句的文件,我们需要这样做才能扩大全局范围。

请注意,您很可能必须根据您的用例更改所提供文件的内容。 index.d.ts

您应该在请求对象上添加您打算访问的所有属性的名称(和类型)。

源代码/类型/index.d.ts
export {}; declare global { namespace Express { interface Request { user: string; } } }

提供的文件只是添加一个user类型为 的属性string,这可能不是您需要的。

例如,如果您不知道特定属性的类型并希望关闭类型检查,请将其设置为any.

源代码/类型/index.d.ts
export {}; declare global { namespace Express { interface Request { user: any; // 👈️ turn off type checking } } }

TypeScript 在查找.d.ts常规文件的相同位置查找文件
.ts

该目录由文件中的
include和设置决定excludetsconfig.json

TypeScript 会将您声明的Request接口与原始Request接口合并,因此当您使用请求对象时,您将能够从两个接口访问属性。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: