Yos*_*shi 14 node.js express typescript
我在 Node.js 中使用 Typescript。当您使用 Express 中间件时,您经常会转换 Request 对象。但是,使用 Typescript,我们无法跟踪 Request 对象是如何转换的。如果知道之前通过的中间件,有没有办法从中找出请求的类型?如果在 express 中不可能,我想找到另一个可能的框架。在 Nest ( https://github.com/kamilmysliwiec/nest ) 中可以吗?
示例代码
import { Request, Response, NextFunction } from 'express';
function userMiddleware(req: Request & User, res: Response, next: NextFunction) {
req.user = {
id: 'user_id',
};
next();
}
interface User {
user: {
id: string;
}
}
interface Middleware {
<T>(req: Request & T, res: Response, next: NextFunction): void;
}
class Controller {
middleware = [userMiddleware];
get = new GetMethod(this.middleware);
post = (req: Request /* I don't know exact req type */, res: Response, next: NextFunction) => {
console.log(req.user) // Error!
}
}
class GetMethod {
constructor(middleware: Middleware[]) {
// How to deduce type of req from Middleware array?
}
}
const controller = new Controller();
express.use('/', controller.middleware, controller.post);
Run Code Online (Sandbox Code Playgroud)
我想从 Controller 类的中间件列表中提取类型信息。
首先我认为正确的界面是
interface User {
id: string;
}
Run Code Online (Sandbox Code Playgroud)
因为它们是回调,所以它们将收到其签名中Request没有的默认值。user
因此,您有两个选择:执行类型断言或编写自定义声明。如果你做得正确的话,两者都会被罚款。
类型断言:
interface User {
id: string;
}
const isObject = (value: unknown): value is {[key: string]: unknown} => {
return value && typeof value === 'object';
};
const isReqWithUser = (req: Request): req is Request & {user: User} => {
return isObject(req) && !!req.user;
}
class Controller {
post = (req: Request, res: Response, next: NextFunction) => {
if (isReqWithUser(req)) {
console.log(req.user) // now it works
}
next();
}
}
Run Code Online (Sandbox Code Playgroud)
报关:
但我们需要了解用户并不总是存在于请求中,我们应该将其标记为可选。
interface User {
id: string;
}
const isObject = (value: unknown): value is {[key: string]: unknown} => {
return value && typeof value === 'object';
};
const isReqWithUser = (req: Request): req is Request & {user: User} => {
return isObject(req) && !!req.user;
}
class Controller {
post = (req: Request, res: Response, next: NextFunction) => {
if (isReqWithUser(req)) {
console.log(req.user) // now it works
}
next();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3475 次 |
| 最近记录: |