res.body 的 TypeScript 类型注释

Mic*_*ens 21 javascript node.js express typescript

我正在为我的应用程序使用打字稿node.js。我想说的res.body是类型personne。我试过这个:

router.post('/',(req: Request, res: Response) => {
   const defunt:PersoneModel = res.(<PersoneModel>body);
}
Run Code Online (Sandbox Code Playgroud)

我有这个模型:

export type PersoneModel = mongoose.Document & {
  nom: String,
  prenom: String,
}
Run Code Online (Sandbox Code Playgroud)

你能帮助我吗?

谢谢你。

ono*_*oya 61

更新:

截至@types/express@4.17.2,该Request类型使用泛型。

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/express/index.d.ts#L107

interface Request<P extends core.Params = core.ParamsDictionary, ResBody = any, ReqBody = any, ReqQuery = core.Query> extends core.Request<P, ResBody, ReqBody, ReqQuery> { }
Run Code Online (Sandbox Code Playgroud)

您可以将类型设置req.bodyPersoneModel这样:

import { Request, Response } from 'express';

router.post('/',(req: Request<{}, {}, PersoneModel>, res: Response) => {
   // req.body is now PersoneModel
}
Run Code Online (Sandbox Code Playgroud)

对于@types/express@4.17.1及以下

遇到类似的问题,我使用泛型解决了它:

import { Request, Response } from 'express';

interface PersoneModel extends mongoose.Document {
  nom: String,
  prenom: String,
}

interface CustomRequest<T> extends Request {
  body: T
}

router.post('/',(req: CustomRequest<PersoneModel>, res: Response) => {
   // req.body is now PersoneModel
}
Run Code Online (Sandbox Code Playgroud)

  • 这些都不适合我。对于 `req: Request&lt;{}, {}, PersoneModel &gt;`,我收到错误“类型请求不是通用的”,对于 `interface CustomRequest&lt;T&gt; extends Request`,我收到错误“类型 'T' 不可分配给类型“ReadableStream&lt;Uint8Array&gt; | null””。使用@types/express ^4.17.9。 (5认同)
  • 通过使用“{}”作为类型,您可以覆盖以前的类型,例如“ParsedQs”。有没有办法在不明确提及的情况下保留它们? (5认同)
  • @Ash &amp; @Peroxy - 您是否从“express”导入“Request”类型?TypeScript 可能从“Fetch API”推断出“Request”类型。 (3认同)

gok*_*and 11

我们可以使用as. 这应该是足够的暗示res.bodyPersoneModel

 const defunt = res.body as PersoneModel;
Run Code Online (Sandbox Code Playgroud)

然而,更直接的方法是将变量的类型声明为 PersoneModel

 const defunt: PersoneModel = res.body;
Run Code Online (Sandbox Code Playgroud)

  • 尽管这可能是当时的首选课程,但我建议使用 Express 的内置泛型而不是这个解决方案,@onoya 的答案中指出。 (3认同)