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
assertIsGetCampaignPackageReqDTOeste exact același ca înif condition, atunci ar trebui să alegi una dintre aceste metode. Eu prefer să folosescif conditionpentru simplitate. - Dacă există alte verificări în funcția assert, ar trebui să folosești ambele: try catch și condiția if. Folosește
ifdacă vrei să prinzi cazuri separate, cum ar ficampaignIdșipackageCode(așa cum este prezentat în codul tău). Și foloseștetry catchpentru 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);
}
