gpt4 book ai didi

javascript - 如何在 TypeScript 中返回具有此自定义类型的 Promise?

转载 作者:行者123 更新时间:2023-12-05 09:35:11 26 4
gpt4 key购买 nike

我不明白 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不是一个(这就是为什么new 不起作用),它是一个类型。在这种情况下,它是一堆不同的可能对象形状。我们来看看

  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 (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 的对象真的很简单,就是对象字面量:

  • 如果失败,它是一个带有 transactionStatus: 'FAILED' 的对象和任意 errorMessage字符串
  • 如果被拒绝,您有 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 };
}
}

关于javascript - 如何在 TypeScript 中返回具有此自定义类型的 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66048477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com