網站搜尋

typescript - 如何將回呼定義為兩種類型之一?


我正在嘗試定義一些類型,這些類型表示回調必須以兩種方式之一使用,要麼它必須是錯誤,在這種情況下它不應該有結果,要麼它必須是結果,在這種情況下它不得有錯誤。

所以這裡舉個例子,這是一個我嘗試使用它的方法:

import { LambdaCallback } from "./types";

export function handler(event:any, context:any, callback:LambdaCallback) {
    console.log(event)
    callback(null, {
      statusCode: 200,
      body: JSON.stringify({msg: "Hello, World!!"})
    })
  }

這是我對類型的嘗試:

export type LambdaCallbackError = string | {};
export type LambdaCallResult = {
    statusCode: number,
    body: string
}

export type LambdaCallbackWithError = (error:LambdaCallbackError) => void;
export type LambdaCallbackWithResult = (error:null, result:LambdaCallResult) => void;
export type LambdaCallback = LambdaCallbackWithError | LambdaCallbackWithResult;

這些類型編譯沒有問題,但當我嘗試使用它時出現以下錯誤:

lambda/hello.ts(6,5):錯誤 TS2349:無法調用其類型缺少調用簽名的表達式。類型 'LambdaCallback' 沒有兼容的調用簽名。

有什麼想法嗎?

答案#1

您的程式碼 LambdaCallbackWithError | LambdaCallbackWithResult

這是錯的。你沒有一個可以成為那些之一的單一函數。你有一個同時是那些兩者的單一函數。

你應該:

export type LambdaCallback = (error:null | LambdaCallbackError, result:LambdaCallResult) => void;