如果存在某个参数,我如何编写一个需要属性的自定义错误类?

Posted

技术标签:

【中文标题】如果存在某个参数,我如何编写一个需要属性的自定义错误类?【英文标题】:How can I write a custom error class that will require a property if a certain argument exists? 【发布时间】:2021-01-18 08:34:11 【问题描述】:

我正在创建一个这样的自定义错误类:

import  OperationalError  from './baseErrors';

type ErrorProps = 
  message: string;
  paymentProvider: 'stripe' | 'braintree';
  failedChargeData: 
    errorMessage: string;
    stripePaymentIntentId?: string;
    braintreeChargeId?: string;
    eventType: string;
  ;
;

export class FailedPaymentError extends OperationalError 
  constructor( message, paymentProvider, failedChargeData : ErrorProps) 
    const properties =  failedChargeData, paymentProvider ;
    super(message, properties, 400);
  

不过我想改进一下。

我想编写某种条件类型,这样如果paymentProvider === 'stripe',那么ErrorProps 将需要stripePaymentIntentId。而如果paymentProvider === 'braintree',则需要braintreeChargeId

我想我需要做这样的事情吗?

import  OperationalError  from './baseErrors';

type PaymentProvider = 'stripe' | 'braintree';
type ErrorProps<T> = 
  message: string;
  paymentProvider: T;
  failedChargeData: T extends 'stripe'
    ? 
        errorMessage: string;
        stripePaymentIntentId: string;
        eventType: string;
      
    : 
        errorMessage: string;
        braintreeChargeId: string;
        eventType: string;
      ;
;

export class FailedPaymentError extends OperationalError 
  constructor(
    message,
    paymentProvider,
    failedChargeData,
  : ErrorProps<PaymentProvider>) 
    const properties =  failedChargeData, paymentProvider ;
    super(message, properties, 400);
  

所以我可以像这样抛出错误:

const failedChargeData = 
  errorMessage: message,
  stripePaymentIntentId: e.type && e.requestId,
  eventType: e.type || 'unexpectedFailedPayment',
;

throw new FailedPaymentError(
  message,
  paymentProvider: 'stripe',
  failedChargeData,
);

但这并不完全奏效。如果我通过错误的支付提供商,TS 不会抱怨。它也不是特别干燥。

这确实有效,但似乎有几行不必要的重复:

type ErrorProps =
  | 
      message: string;
      paymentProvider: 'stripe';
      failedChargeData: 
        errorMessage: string;
        stripePaymentIntentId: string;
        eventType: string;
      ;
    
  | 
      message: string;
      paymentProvider: 'braintree';
      failedChargeData: 
        errorMessage: string;
        braintreeChargeId: string;
        eventType: string;
      ;
    ;

我该怎么做?谢谢

【问题讨论】:

【参考方案1】:

上一个示例中的可区分联合是完全正确的。

您可以通过从基本界面中提取可区分的类型来干掉它。

type MapErrorProps<T, K> = 
  message: string;
  paymentProvider: T;
  failedChargeData: 
    errorMessage: string;
    eventType: string;
   & K;
;

// Map each type to a required data interface
type ErrorProps = MapErrorProps<"stripe",  stripePaymentIntentId: string >
  | MapErrorProps<"braintree",  braintreeChargeId: string >;
  | MapErrorProps<"iceCream",  flavor: string >;

【讨论】:

以上是关于如果存在某个参数,我如何编写一个需要属性的自定义错误类?的主要内容,如果未能解决你的问题,请参考以下文章

在 keras 回调中使用带有自定义参数的自定义函数

如何编写带有可变数量参数的F#printfn的自定义版本?

如果有 0 或 1 个项目,如何创建没有箭头的自定义 tkinter 组合框?

y_pred 的自定义损失函数 Keras 仅高于某个阈值

在 WPF C# 中无法访问用户控件的自定义属性

如何创建传递参数的自定义Facebook共享对话框?