簡體   English   中英

如何在 TypeScript 中返回具有此自定義類型的 Promise?

[英]How do I return a Promise with this custom type in TypeScript?

我無法弄清楚 ParsedAuthorizationResponse 是如何實現的,以及如何以不同的方式設置它的值。 最終,我想將某個值/類型作為 promise 返回。

我認為這會起作用,但它沒有

let PAR; 
if (status === 'COMPLETED') { 
PAR = new ParsedAuthorizationResponse('AUTHORIZED')
} else throw new Error('Authorization failed')

return Promise<PAR>;
}

//Also tried this but didn't work

type ParsedAuthorizationResponse PAR = 'AUTHORIZED';
return new Promise<PAR>;

ParsedAuthorizationResponse不是class (這就是為什么new不起作用),它是type 在這種情況下,它是一堆不同的可能 object 形狀。 我們來看一下

  export type ParsedAuthorizationResponse =
  | IAuthResponse<
      { processorTransactionId: string },
      'AUTHORIZED' | 'CANCELLED' | 'SETTLING' | 'SETTLED'
    >
  | IAuthResponse<{ declineReason: string }, 'DECLINED'>
  | IAuthResponse<{ errorMessage: string }, 'FAILED'>;

對,這告訴我們ParsedAuthorizationResponse只是IAuthResponse的三種不同參數化中的任何一種的同義詞。 不幸的是,在我們知道IAuthResponse是什么樣子之前,這並不能告訴我們太多。 幸運的是,我們這樣做:

type IAuthResponse<T, U extends TransactionStatus> = T & {
  transactionStatus: U;
};

好的,這變得更具體了。 TransactionStatus只是幾個文字字符串的同義詞,而T & { transactionStatus: U; } T & { transactionStatus: U; }是一個類型連詞,這意味着結果是一個與類型T類似的類型,加上一個類型為U的字段transactionStatus (它與U extends TransactionStatus被限制為一個或多個我們稱為TransactionStatus的字符串)。

那么IAuthResponse<{ errorMessage: string }, 'FAILED'>是什么意思呢? 好吧,看看IAuthResponse ,它擴展為:

{ errorMessage: string } & { transactionStatus: 'FAILED' }

這與

{ errorMessage: string; transactionStatus: 'FAILED' }

這意味着ParsedAuthorizationResponse實際上看起來像這樣:

type ParsedAuthorizationResponse =
      | { processorTransactionId: string; transactionStatus: 'AUTHORIZED' | 'CANCELLED' | 'SETTLING' | 'SETTLED' }
      | { declineReason: string; transactionStatus: 'DECLINED' }
      | { errorMessage: string; transactionStatus: 'FAILED' }

所以,創建一個符合ParsedAuthorizationResponse真的很容易,它只是 object 文字:

  • 如果失敗,則為errorMessagetransactionStatus: 'FAILED'和任意錯誤消息字符串
  • 如果它被拒絕,你有transactionStatus: 'DECLINED'和一個任意的declineMessage字符串
  • 否則,它的transactionStatus設置為'AUTHORIZED''CANCELLED''SETTLING''SETTLED' ,再加上一個processorTransactionId ,它是一個字符串,我假設你會處理事務的狀態。

你的例子最終會是這樣的:

  async authorize(
    request: RawAuthorizationRequest<ClientIDSecretCredentials, PayPalOrder>,
  ): Promise<ParsedAuthorizationResponse> {
      // The response needs to contain status and transaction ID
      const { status, processorTransactionId } = JSON.parse(await response) as { status: string; processorTransactionId: string; }
      switch (status) {
        case 'COMPLETE':
          return { transactionStatus: 'AUTHORIZED', processorTransactionId };
        case 'VOIDED':
          return { transactionStatus: 'CANCELLED', processorTransactionId };
        // TODO: Fill in more cases here...
        default: 
          // Unknown status, hopefully shouldn't happen, but for the sake of
          // argument, let's pretend that failing the transaction is a reasonable
          // thing to do here, just to show how to return an error message
          return { transactionStatus: 'FAILED', errorMessage: 'Unknown status: ' + status };
      }
    }

返回 promise 類型非常容易,並且與返回原語的 promise 沒有什么不同。

async function 返回的任何值都將用 promise 包裝,因此:

const returnsANumber = async (): Promise<number> => {
  return 42
}

type Foo = {
  foo: true
}

const returnsAFoo = async (): Promise<Foo> => {
  return {
    foo: true
  }
}

TS游樂場

在您的情況下,只需返回ParsedAuthorizationResponse

首先,正如@thedude 所說,因為您的 function 已經是async的,所以無需返回 Promise,無論您返回什么都會自動變成 Promise。

現在回答:“如何返回ParsedAuthorizationResponse ”。

從(部分)定義開始:

export type ParsedAuthorizationResponse =
  | IAuthResponse<
      { processorTransactionId: string },
      'AUTHORIZED' | 'CANCELLED' | 'SETTLING' | 'SETTLED'
    >

(我只會用 ParsedAuthorisationResponse 的一個例子來做這個邏輯,希望你能做剩下的)

這表示它是一個IAuthResponse<T, U>其中 T 是{ processorTransactionId: string }而 U 是'AUTHORIZED' | 'CANCELLED' | 'SETTLING' | 'SETTLED' 'AUTHORIZED' | 'CANCELLED' | 'SETTLING' | 'SETTLED'

將其放入IAuthResponse 的定義中給了我們

type IAuthResponse<T, U extends TransactionStatus> = {
  processorTransactionId: string,
  transactionStatus: 'AUTHORIZED' | 'CANCELLED' | 'SETTLING' | 'SETTLED';
};

意味着ParsedAuthorizationResponse的一個例子是

{
  processorTransactionId: "any old string",
  transactionStatus: 'AUTHORIZED',
}

因此,要從您的 function 中返回它,請使用以下內容:

async authorize(
    request: RawAuthorizationRequest<ClientIDSecretCredentials, PayPalOrder>,
  ):ParsedAuthorizationResponse {
      //just imagine I'm gonna get a response that has a value of status in it
      const { status } = JSON.parse(await response)
      
      return {
          processorTransactionId: status, // or whatever
          transactionStatus: 'AUTHORIZED',
      };
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM