const statusMap = { pmt_incomplete: '待支付', pmt_complete: '待确认', un_used: '待出行', used: '已关闭', finish: '已关闭', cancel: '已取消', refunding: '退款中', refunded: '已退款', } /** * @param value * @param status */ export function getOrderStatus(value: string) { return statusMap[value] || '未知'; } 提示报错 Element implicitly has an 'any' type because expression of type 'string' can't be used to index type
时间: 2023-12-22 18:06:33 浏览: 143
这个报错是因为 TypeScript 无法确定 `value` 参数一定是 `statusMap` 对象中的一个有效键。为了解决这个问题,可以为 `statusMap` 指定键的类型,例如:
```
const statusMap: { [key: string]: string } = {
pmt_incomplete: '待支付',
pmt_complete: '待确认',
un_used: '待出行',
used: '已关闭',
finish: '已关闭',
cancel: '已取消',
refunding: '退款中',
refunded: '已退款'
};
```
这样就可以避免报错了。
相关问题
这段代码如何优化圈复杂度 export function getOrderStatus(value: string) { switch (value) { case 'pmt_incomplete': return '待支付'; case 'pmt_complete': return '待确认'; case 'un_used': return '待出行'; case 'used': return '已关闭'; case 'finish': return '已关闭'; case 'cancel': return '已取消'; case 'refunding': return '退款中'; case 'refunded': return '已退款'; default: return '未知'; }
圈复杂度是指一个函数中不同执行路径的数量。在这段代码中,圈复杂度为 8,因为有 8 个不同的 case 分支。
为了优化圈复杂度,可以考虑使用对象来代替 switch 语句,将状态码作为对象的属性,对应的中文状态作为对象的值。这样可以简化代码,减少圈复杂度。
下面是优化后的代码示例:
```typescript
const statusMap = {
'pmt_incomplete': '待支付',
'pmt_complete': '待确认',
'un_used': '待出行',
'used': '已关闭',
'finish': '已关闭',
'cancel': '已取消',
'refunding': '退款中',
'refunded': '已退款'
};
export function getOrderStatus(value: string) {
return statusMap[value] || '未知';
}
```
在优化后的代码中,我们将状态码与对应的中文状态存储在一个对象中,并将对象作为函数的一部分。函数中直接根据状态码从对象中取出对应的中文状态,如果找不到则返回默认值 '未知'。
这样做的好处是,圈复杂度得以降低,代码也变得更加简洁易懂。同时,如果需要新增或修改状态码,只需要修改对象中对应的属性即可,不需要修改 switch 语句中的代码,从而降低了维护成本。
c++中两个方法只有一个地方调用了设置类不同属性的函数,如何优化这两个代码:void ZMMapImp::SetSingleSlotStatus(const DTYPE_FEATURE_ID slotId, enum SLOT_STATUS status) { if (slotId == INVALID_SLOTID) { ZINFO << "SetSlotStatus SlotID not valid : " << slotId; return; } auto parkingId = dblib::UnpackParkingId(dblib::UnpackMapId(slotId)); auto virMap = dblib::VmManager::Instance().GetVMap(parkingId); auto localMap = dblib::VmManager::Instance().GetVLocalMap(dblib::UnpackMapId(slotId)); RETURN_IF_NULL(virMap) RETURN_IF_NULL(localMap) virMap->SetSlotStatus(slotId, status); const dblib::VMSlot* vmSlot = virMap->GetSlot(slotId); if (vmSlot != nullptr) { SlotInfo destSlot; ConvertSlotInfo(vmSlot, localMap->GetZlevel(), localMap->GetRampId(), destSlot); m_defaultTask->RtdMgr()->AddVmSlot(destSlot); } } void ZMMapImp::SetSingleSlotAvailable(const DTYPE_FEATURE_ID slotId, SLOT_AVAILABLE_STATUS status) { if (slotId == INVALID_SLOTID) { ZINFO << "SetSlotStatus SlotID not valid : " << slotId; return; } auto parkingId = dblib::UnpackParkingId(dblib::UnpackMapId(slotId)); auto virMap = dblib::VmManager::Instance().GetVMap(parkingId); auto localMap = dblib::VmManager::Instance().GetVLocalMap(dblib::UnpackMapId(slotId)); RETURN_IF_NULL(virMap) RETURN_IF_NULL(localMap) virMap->SetSlotAvailableStatus(slotId, status); const dblib::VMSlot* vmSlot = virMap->GetSlot(slotId); if (vmSlot != nullptr) { SlotInfo destSlot; ConvertSlotInfo(vmSlot, localMap->GetZlevel(), localMap->GetRampId(), destSlot); m_defaultTask->RtdMgr()->AddVmSlot(destSlot); } }
可以将这两个方法中的相同部分提取出来,封装成一个私有函数,然后在两个方法中分别调用这个函数即可。具体的实现可以参考下面的示例代码:
```
void ZMMapImp::UpdateSlotStatus(const DTYPE_FEATURE_ID slotId, std::function<void(dblib::VMSlot*)> updateFunc) {
if (slotId == INVALID_SLOTID) {
ZINFO << "UpdateSlotStatus SlotID not valid : " << slotId;
return;
}
auto parkingId = dblib::UnpackParkingId(dblib::UnpackMapId(slotId));
auto virMap = dblib::VmManager::Instance().GetVMap(parkingId);
auto localMap = dblib::VmManager::Instance().GetVLocalMap(dblib::UnpackMapId(slotId));
RETURN_IF_NULL(virMap)
RETURN_IF_NULL(localMap)
auto vmSlot = virMap->GetSlot(slotId);
if (vmSlot != nullptr) {
updateFunc(vmSlot);
SlotInfo destSlot;
ConvertSlotInfo(vmSlot, localMap->GetZlevel(), localMap->GetRampId(), destSlot);
m_defaultTask->RtdMgr()->AddVmSlot(destSlot);
}
}
void ZMMapImp::SetSingleSlotStatus(const DTYPE_FEATURE_ID slotId, enum SLOT_STATUS status) {
UpdateSlotStatus(slotId, [status](dblib::VMSlot* vmSlot) {
vmSlot->SetSlotStatus(status);
});
}
void ZMMapImp::SetSingleSlotAvailable(const DTYPE_FEATURE_ID slotId, SLOT_AVAILABLE_STATUS status) {
UpdateSlotStatus(slotId, [status](dblib::VMSlot* vmSlot) {
vmSlot->SetSlotAvailableStatus(status);
});
}
```
在这个实现中,我定义了一个名为 `UpdateSlotStatus` 的私有函数,用于更新车位的状态或可用状态。这个函数接受两个参数:车位 ID 和一个函数对象 `updateFunc`,用于更新车位状态。函数对象 `updateFunc` 的参数是一个指向 `dblib::VMSlot` 类型的指针,表示要更新的车位。在 `SetSingleSlotStatus` 和 `SetSingleSlotAvailable` 方法中,我分别调用了 `UpdateSlotStatus` 函数,同时传递不同的 `updateFunc` 参数,以实现更新车位状态或可用状态的功能。
阅读全文