这些打字稿功能可以清理或简化吗?

时间:2020-12-23 19:07:23

标签: typescript

我有这两个功能:

import { handler } from '../lib/handler-lib'
import { APIGatewayEvent, Context } from 'aws-lambda'

export const producer = handler(async (
  _event: APIGatewayEvent,
  _context: Context
): Promise<object> => {
  return {
    some: 'data result'
  }
})
import {
  APIGatewayEvent,
  APIGatewayProxyResult,
  Context
} from 'aws-lambda'

export const handler = (lambda: Function): object => {
  return async (
    event: APIGatewayEvent,
    context: Context
  ): Promise<APIGatewayProxyResult> => {
    let body: object
    let statusCode: number

    try {
      body = await lambda(event, context)
      statusCode = 200
    } catch (e) {
      body = { error: e.message }
      statusCode = 500
    }

    return {
      body: JSON.stringify(body),
      statusCode
    }
  }
}

这完全可以简化吗?

这两个函数都定义了 eventcontext 的类型,如果只有第二个函数这样做就太好了,这样所有调用者都可以免费获得类型声明。

是否应该定义 lambda: Function 的参数?

1 个答案:

答案 0 :(得分:0)

首先,我会用输入和输出值更清晰地定义 lambda 函数。

lambda: (e: APIGatewayEvent, ctx: Context) => Promise<any>

此外,您还可以通过简单地返回而不创建临时变量来使代码更加简洁:

import {
  APIGatewayEvent,
  APIGatewayProxyResult,
  Context
} from 'aws-lambda'

export const handler = (lambda: (e: APIGatewayEvent, ctx: Context) => Promise<any>): object => {
  return async (
    event: APIGatewayEvent,
    context: Context
  ): Promise<APIGatewayProxyResult> => {
    try {
      return {
          body: JSON.stringify(await lambda(event, context)),
          statusCode: 200
      } 
    } catch (e) {
         return {
          body: JSON.stringify({ error: e.message }),
          statusCode: 500
      } 
    }
  }
}
相关问题