AWS Lambda Callback的函数签名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AWS Lambda Callback的函数签名相关的知识,希望对你有一定的参考价值。

我想为AWS Lambda的回调函数创建一个Typescript,并且必须做一些愚蠢的事情,因为我在看似容易的事情上遇到错误。我接近它的方法是为SUCCESS和FAILURE条件设置两个函数定义,然后将它们包装在一起作为一个有区别的联合。

所以这是我的类型:

export interface ILambdaSuccessCallback<T = IDictionary> {
  (error: null, response: T): void;
}

export interface ILambdaFailureCallback<E = ILambdaErrorResponse> {
  (error: string | number, response: E): void;
}

export interface ILambdaErrorResponse<T = any> {
  errorCode?: string | number;
  message?: string;
  errors?: T[];
  stackTrace?: string[];
}

/** Discriminated Union */
export type LambdaCallback<T = IDictionary, E = ILambdaErrorResponse> =
  | LambdaSuccessCallback<T>
  | LambdaFailureCallback<E>;

我现在将我的小视觉测试包含在vs-code中,显示失败和成功的行为或明确使用,但更重要的是,这种歧视联盟只是不起作用:

enter image description here

答案

联合类型(使用|定义)表示可以是ILambdaSuccessCallbackILambdaFailureCallback的类型,这意味着两个签名都不可调用,因为编译器无法检查哪个是有效的。使用联合类型,您只能访问公共字段和签名,而ILambdaSuccessCallbackILambdaFailureCallback没有共同的属性或签名,

如果你的函数可以处理两个签名,你想要一个交集类型(用&定义)

export type LambdaCallback<T = IDictionary, E = ILambdaErrorResponse> =
    & ILambdaSuccessCallback<T>
    & ILambdaFailureCallback<E>;

const either: LambdaCallback = function (err: null | string | number, con: IDictionary | ILambdaErrorResponse) {

}
either(null, {}) // Works
either(500, {}) // Works

第二个failure调用(failure(null, {}))有效,因为在Typescript中,nullundefined是所有类型的子类型(请参阅spec),因此您可以将null分配给string | number,您可以启用strictNullChecks以使编译器禁止此情况(但这可能会导致很多其他警告)

以上是关于AWS Lambda Callback的函数签名的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 函数返回模块“索引”上缺少的处理程序“处理程序”

使用 API Gateway 处理 AWS Lambda 函数中的错误

如何在 Lambda 函数中使用 AWS.CloudFront.Signer

如何访问 AWS Lambda 中的标头?

如何从 lambda 调用 IAM 授权的 AWS ApiGateway 端点?

Amazon API Gateway 和 AWS Lambda 中的错误处理模式