打字稿中开关的替代方法

时间:2021-07-01 06:33:32

标签: javascript angular typescript switch-statement object-literal

我正在考虑我的开关箱的任何替代方案,因为它很长 我有嵌套的开关盒,看起来像这样

switch (currentTab) {
            case pending:
                switch (status) {
                    case approved:
                    case denied:
                        break;

                    case partialApproved:
                        finalUpdatedInvoiceAmount = updatedInvoiceAmount - (feeAmount - (approvedFeeAmount || 0));
                        break;
                }
                break;

            case approved:
                switch (status) {
                    case denied:
                    case partialApproved:
                        finalUpdatedInvoiceAmount = updatedInvoiceAmount - (feeAmount - (approvedFeeAmount || 0));
                        break;
                }
                break;

            case denied:
                switch (status) {
                    case approved:
                    case partialApproved:
                        finalUpdatedInvoiceAmount = oldApprovedFeeAmount ? updatedInvoiceAmount + (feeAmount - oldApprovedFeeAmount) : updatedInvoiceAmount - (feeAmount - (approvedFeeAmount || 0));
                        break;
                }
                break;

            case partiallyApprovedTab:
                switch (status) {
                    case approved:
                    case denied:
                    case partialApproved:
                        finalUpdatedInvoiceAmount = oldApprovedFeeAmount ? updatedInvoiceAmount + (feeAmount - oldApprovedFeeAmount) : updatedInvoiceAmount - (feeAmount - (approvedFeeAmount || 0));
                        break;
                }
                break;
        }

这是另一种可能性吗? 由于代码非常庞大,以后可能会出现其他情况。

1 个答案:

答案 0 :(得分:5)

也许你可以试试handlerMap:

const handler1 = () => { finalUpdatedInvoiceAmount = updatedInvoiceAmount - (feeAmount - (approvedFeeAmount || 0)); }
const handler2 = () => { finalUpdatedInvoiceAmount = oldApprovedFeeAmount ? updatedInvoiceAmount + (feeAmount - oldApprovedFeeAmount) : updatedInvoiceAmount - (feeAmount - (approvedFeeAmount || 0)); }

const handlerMap = {
  [pending]: {
    [partialApproved]: handler1
  },
  [approved]: {
    [denied]: handler1,
    [partialApproved]: handler1,
  },
  [denied]: {
    [approved]: handler2,
    [partialApproved]: handler2,
  },
  [partiallyApprovedTab]: {
    [approved]: handler2,
    [denied]: handler2,
    [partialApproved]: handler2,
  }
}

handlerMap[currentTab] && handlerMap[currentTab][status] && handlerMap[currentTab][status]()
// handlerMap[currentTab]?.[status]?.()