【问题标题】:TypeScript type annotation for res.bodyres.body 的 TypeScript 类型注释
【发布时间】:2018-06-10 04:29:39
【问题描述】:

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

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

我有这个模型:

export type PersoneModel = mongoose.Document & {
  nom: String,
  prenom: String,
}

你能帮帮我吗?

谢谢。

【问题讨论】:

    标签: javascript node.js typescript express


    【解决方案1】:

    更新:

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

    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> { }
    

    您可以像这样将req.body 的类型设置为PersoneModel

    import { Request, Response } from 'express';
    
    router.post('/',(req: Request<{}, {}, PersoneModel>, res: Response) => {
       // req.body is now PersoneModel
    }
    

    @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
    }
    

    【讨论】:

    • 太棒了!如何使用 RequestHandler 类型输入这个?
    • 这些都不适合我。对于req: Request&lt;{}, {}, PersoneModel &gt;,我收到错误“类型请求不是通用的”,对于interface CustomRequest&lt;T&gt; extends Request,我收到错误“类型'T' 不可分配给类型'ReadableStream | null'”。使用@types/express ^4.17.9.
    • 与@Ash 相同,我使用的是 4.17.11 .. 不知道任何人都可以做到这一点
    • @Ash & @Peroxy - 你是从express 导入Request 类型吗?可能是 TypeScript 从 Fetch API 推断出 Request 类型。
    • 对于那些感兴趣的人,我在这里的示例项目中有一个工作示例:github.com/BeyondCodeBootcamp/jsdoc-typescript-starter
    【解决方案2】:

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

     const defunt = res.body as PersoneModel;
    

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

     const defunt: PersoneModel = res.body;
    

    【讨论】:

      【解决方案3】:
      router.post('/',(req: Omit<Request,'body'> & { body: PersoneModel }, res: Response) => {
         // code
      }
      

      这也可以,如果你想创建抽象,这很有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-18
        • 2021-12-22
        • 2012-10-02
        • 2020-09-02
        • 2022-07-05
        • 2016-03-31
        • 2019-01-30
        • 1970-01-01
        相关资源
        最近更新 更多