jeremydaly / lambda-api

Lightweight web framework for your serverless applications
https://serverless-api.com
MIT License
1.41k stars 125 forks source link

[Feature request] Typescript - Support generic request / response types #244

Open jrbarnard opened 11 months ago

jrbarnard commented 11 months ago

Currently the Request and Response types are defined without any easy way to override them. I would like to be able to either supply generic response types or extended request types for a given route which allows me to have clearly defined types for the input/output of that route.

E.g if I have a route that should return a given shape of JSON, currently the .json method on response expects any, however if I could define the route with a Response type of a given shape, typescript would fail to compile if I had implemented the transformation in my route wrong.

And for request extension, one use case is you have middleware that does your validation, so by the time you get to your route, you know the shape of your request. E.g which path params are present, or query string params are required and so on. It would be nice to be able to define a request extension for that route to avoid unnecessary checks or casting or non null assertions.

I'm happy to work on this and submit a couple of PRs, but would be keen to get some feedback first of all on how we'd want this to work / any considerations that need to be taken into account before hand.

A rough code example:

import { Request, Response } from 'lambda-api';

interface MyDefinedRequest extends Request {
  params: {
    thingId: string;
    anotherThingId: string;
  };
  context: Context & { metrics: MetricsLogger };
}

interface MyDefinedResponseBody {
  hello: string;
  foo: string;
}

export default (request: MyDefinedRequest, response: Response<MyDefinedResponseBody>): void => {
  const { metrics } = request.context;

  metrics.setProperty('test', true);

  const { thingId, anotherThingId } = request.params;

  response.json({
    hello: thingId,
    foo: anotherThingId,
  });
};
naorpeled commented 11 months ago

@jrbarnard great suggestion!

Will give this some thought and keep you updated with my thoughts :)