AWS Lambda Callback的函数签名

时间:2018-03-06 02:24:54

标签: typescript aws-lambda

我想为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

1 个答案:

答案 0 :(得分:1)

联合类型(使用|定义)表示可以是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以使编译器禁止此方案(但这可能会导致许多其他警告)