代码之家  ›  专栏  ›  技术社区  ›  Lin Du Correcter

应该尝试catch TypeScript断言函数吗?

  •  1
  • Lin Du Correcter  · 技术社区  · 4 年前

    我创建了一个TS断言函数,稍后,在将请求DTO传递到UI事件处理程序中的API服务之前使用它。

    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);
      }
    };
    

    我应该使用吗 try...catch 语句,并向用户显示错误消息?或者,我应该验证合法性( if 语句)。断言函数仅用于通过TSC检查?

    或者这样:

    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));
      }
    };
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   irous    4 年前

    我想你想要的只是捕捉异常,而不是让你的程序崩溃。

    • 如果代码起作用 assertIsGetCampaignPackageReqDTO 与中完全相同 if condition ,那么您应该选择其中一种方法。我更喜欢使用 if条件 为了简单起见。
    • 如果在assert函数中还有其他检查,则应该同时使用:try-catch和If-condition。使用 if 如果您想捕获诸如 campaignId 和 packageCode (如代码中所示)。并且使用 try catch 以捕捉其他失败案例。
    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);
    }
    
    
    推荐文章