Ar trebui să încerc să prind funcția de aserțiune TypeScript?


Creez o funcție de aserțiune TS, mai târziu o folosesc înainte de a transmite DTO-ul cererii către serviciul API într-un handler de eveniment UI.

function assertIsGetCampaignPackageReqDTO(
  value: any,
): asserts value is GetCampaignPackageRuquestDTO {
  if (!value.campaignId || !value.packageCode) {
    throw new Error('campaignId or packageCode is empty!');
  }
}

const onSearchFormSubmit = async (e: FormEvent<HTMLFormElement>) => {
  e.preventDefault();
  try {
    assertIsGetCampaignPackageReqDTO(searchCondition);
    const { value } = await getCampaignPackageQuery.execute(searchCondition);
    if (value?.code === '0') {
      setCampaignPackages(campaignPackages.concat(value.result));
    }
  } catch (error) {
    message.error(error.message);
  }
};

Ar trebui să folosesc instrucțiunea try...catch cu funcția de assert și să afișez mesajul de eroare utilizatorilor? Sau ar trebui să validez legalitatea (instrucțiunea if) a DTO-ului cererii înainte de a folosi funcția de assert. Funcția de assert este folosită doar pentru a trece verificarea TSC?

Sau asta:

function assertIsGetCampaignPackageReqDTO(
  value: any,
): asserts value is GetCampaignPackageRuquestDTO {
  if (!value.campaignId || !value.packageCode) {
    throw new Error('value is not GetCampaignPackageRuquestDTO');
  }
}

const onSearchFormSubmit = async (e: FormEvent<HTMLFormElement>) => {
  e.preventDefault();
  if (!searchCondition.campaignId || !searchCondition.packageCode) {
    return message.error('campaignId or packageCode is empty!');
  }
  assertIsGetCampaignPackageReqDTO(searchCondition);
  const { value } = await getCampaignPackageQuery.execute(searchCondition);
  if (value?.code === '0') {
    setCampaignPackages(campaignPackages.concat(value.result));
  }
};

Răspuns #1

Presupun că tot ce vrei este să prinzi excepțiile în loc să lași programul să se prăbușească.

  • Dacă codul din funcția assertIsGetCampaignPackageReqDTO este exact același ca în if condition, atunci ar trebui să alegi una dintre aceste metode. Eu prefer să folosesc if condition pentru simplitate.
  • Dacă există alte verificări în funcția assert, ar trebui să folosești ambele: try catch și condiția if. Folosește if dacă vrei să prinzi cazuri separate, cum ar fi campaignId și packageCode (așa cum este prezentat în codul tău). Și folosește try catch pentru a prinde alte cazuri de eșec.
if (!searchCondition.campaignId || !searchCondition.packageCode) {
    return message.error('campaignId or packageCode is empty!');
}

try {
    assertIsGetCampaignPackageReqDTO(searchCondition);
    const { value } = await getCampaignPackageQuery.execute(searchCondition);
    if (value?.code === '0') {
      setCampaignPackages(campaignPackages.concat(value.result));
    }
} catch (error) {
    message.error(error.message);
}