代码之家  ›  专栏  ›  技术社区  ›  ken

AWS Lambda回调函数签名

  •  2
  • ken  · 技术社区  · 7 年前

    我想为AWS Lambda的回调函数创建一个Typescript,但我必须做一些愚蠢的事情,因为我在一些看似简单的事情上出错了。我处理它的方法是为成功和失败条件定义两个函数,然后将它们打包为 受歧视的工会 .

    以下是我的类型:

    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代码中加入了我的小视觉测试,显示了 失败 成功 但更重要的是,受歧视的工会根本不起作用:

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    7 年前

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

    如果您的函数可以处理两个签名,则需要交叉点类型(定义为 & )

    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中, null undefined 是所有类型的子类型(请参见 spec )因此您可以分配 无效的 string | number 您可以启用 strictNullChecks 使编译器禁止这种情况(但这可能会导致许多其他警告)