如果存在某个参数,我如何编写一个需要属性的自定义错误类?
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 >;
【讨论】:
以上是关于如果存在某个参数,我如何编写一个需要属性的自定义错误类?的主要内容,如果未能解决你的问题,请参考以下文章