[英]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 文字:
errorMessage
, transactionStatus: '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
}
}
在您的情況下,只需返回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.