我不明白 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/