【问题标题】:How to Type Fastify Reply payloads?如何输入 Fastify 回复有效载荷?
【发布时间】:2020-07-12 17:11:52
【问题描述】:

我刚刚开始使用 Typescript 进入 Fastify 并非常享受它。

但是,我正在尝试确定是否可以键入响应负载。我有 response schema for serialization 工作,这可能就足够了,但我有内部类型的对象(例如 IUser),最好让 Typescript 对其进行检查。

下面的效果很好,但我想返回一个 TUser 例如,如果我返回不同的东西,我有打字稿。使用模式只是排除字段。

interface IUser {
    firstname: string,
    lastname: string
} // Not in use in example

interface IUserRequest extends RequestGenericInterface {
  Params: { username: string };
}

const getUserHandler = async (
  req: FastifyRequest<IUserRequest, RawServerBase, IncomingMessage | Http2ServerRequest>
) => {
  const { username } = req.params;
  return { ... }; // Would like to return instance of IUser
};


app.get<IUserRequest>('/:username', { schema }, helloWorldHandler);

我可以为响应扩展一个等效的 RequestGenericInterface 吗?

小更新:似乎reply.send() 可以用来添加类型,但为了自我说明,提供更高的 T 会很好。

【问题讨论】:

    标签: node.js typescript fastify


    【解决方案1】:

    来自documentation

    使用这两个接口,定义一个新的 API 路由并将它们作为泛型传递。速记路由方法(即 .get)接受包含五个命名属性的通用对象 RouteGenericInterface:BodyQuerystringParamsHeadersReply

    您可以使用Reply 类型。

    interface MiscIPAddressRes {
      ipv4: string
    }
    server.get<{
      Reply: MiscIPAddressRes
    }>('/misc/ip-address', async (req, res) => {
      res
        .status(_200_OKAY)
        .send({
          ipv4: req.ip // this will be typechecked
      })
    })
    

    【讨论】:

      【解决方案2】:

      如果你只想键入处理程序,你可以这样执行

      import { RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerDefault, RouteHandler, RouteHandlerMethod } from "fastify";
      
      const getUserHandler: RouteHandlerMethod<
          RawServerDefault,
          RawRequestDefaultExpression,
          RawReplyDefaultExpression,
          { Reply: IUser; Params: { username: string } }
      > = async (
        req: FastifyRequest<IUserRequest, RawServerBase, IncomingMessage | Http2ServerRequest>
      ) => {
        const { username } = req.params;
        return { ... }; // Would like to return instance of IUser
      };
      

      【讨论】:

        猜你喜欢
        • 2020-04-26
        • 1970-01-01
        • 2020-04-21
        • 2022-01-11
        • 2016-07-22
        • 2011-10-01
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多