属性在 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
文件的目录:
export {}; declare global { namespace Express { interface Request { user: string; } } }
该示例显示了如何使用类型为.named 的属性
扩展Request
接口。user
string
请注意,这在您的用例中很可能会有所不同,因此请务必调整属性名称和类型。
这是我index.ts
使用该req.user
属性的文件。
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
。
我使用nodemon
with这是我
文件ts-node
的内容。nodemon.json
{ "watch": ["src"], "ext": ".ts,.js", "ignore": [], "exec": "ts-node --files ./src/index.ts" }
添加--files
标志后(仅在使用时才需要ts-node
),重新启动服务器,您应该一切顺利。
将你的类型目录的路径添加到你的tsconfig.json
文件中
如果错误仍然存在,请尝试将types
目录
路径添加到tsconfig.json中。
{ "compilerOptions": { // ... rest "typeRoots": ["./node_modules/@types", "./src/types"] } }
我们使用文件export {}
中的行将index.d.ts
其标记为外部模块。
模块是一个包含至少 1 个import
orexport
语句的文件,我们需要这样做才能扩大全局范围。
index.d.ts
您应该在请求对象上添加您打算访问的所有属性的名称(和类型)。
export {}; declare global { namespace Express { interface Request { user: string; } } }
提供的文件只是添加一个user
类型为 的属性string
,这可能不是您需要的。
例如,如果您不知道特定属性的类型并希望关闭类型检查,请将其设置为any
.
export {}; declare global { namespace Express { interface Request { user: any; // 👈️ turn off type checking } } }
TypeScript 在查找.d.ts
常规文件的相同位置查找文件
.ts
。
该目录由文件中的
include
和设置决定。exclude
tsconfig.json
TypeScript 会将您声明的Request
接口与原始Request
接口合并,因此当您使用请求对象时,您将能够从两个接口访问属性。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: