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

标签 javascript typescript type-conversion typescript-generics return-type

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

相关文章:

javascript - 无法真正理解 Javascript 中的构造函数和原型(prototype)关系

java - 验证码图像返回二进制数据?如何显示这个?

java - 如何将 byte[] 正确转换为 String?

javascript - 使用 TypeScript + Webpack 导入 svgs

javascript - 继承类的不同返回类型

java - 将整数颜色值转换为 RGB

java - 如何设置Json schema的类型?

javascript - 使用 Vuex getter 从数组中获取对象

javascript - 从匿名函数访问函数参数

javascript - 在构造方法中初始化 Promises 类字段