You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中为保障运行时安全,是否需要进行空值检查?

问题

TypeScript的类型仅在编译阶段生效,运行时不存在任何类型约束。当定义一个接收string类型参数的TypeScript函数时,是否有必要进行空值检查?这个疑问源于实际场景中,若API返回null值,很可能会引发运行时错误。

参考以下代码片段:

const capitalise = (val: string) => {
   // 疑问:该检查是否因TypeScript的类型检查而冗余?
   if (!val) {
      return '';
   }

   return val.toUpperCase();
};

// 假设'name'从可能返回null的API或其他源获取
const name: string = /* 从API或其他源获取数据 */;

capitalise(name);

请问在此类场景下,保障TypeScript应用运行时安全的最佳实践有哪些?

回答

核心结论:空值检查完全有必要,绝非冗余

TypeScript的类型标注只是编译期的“君子协定”,完全管不住运行时的实际值。比如你代码里把API返回的null强行标注成string,编译时不会报错,但运行时传入null的话,val.toUpperCase()直接就会抛错——因为null根本没有toUpperCase方法。

保障运行时安全的最佳实践

  • 别硬给不确定类型的值“瞎标类型”
    比如API返回的name可能是string | null,就老老实实写成const name: string | null = /* 接口数据 */;,别硬凑成string。TypeScript的类型系统本来就是帮你提前踩坑的,别自己骗自己。
  • 在函数入口加参数校验
    你代码里的if (!val)已经很实用,还能更严谨:
    const capitalise = (val: string) => {
       if (typeof val !== 'string') {
          return '';
       }
       return val.toUpperCase();
    };
    
    不管是null、undefined还是其他类型的值闯进来,都能提前拦截,避免运行时崩溃。
  • 用类型守卫先过滤不确定值
    拿到API返回的数据后,先做校验,确认是预期类型再传给函数:
    const name = await fetchNameFromAPI();
    if (typeof name === 'string') {
       capitalise(name);
    } else {
       // 处理null/undefined的情况,比如给默认值
       capitalise('');
    }
    
  • 打开TypeScript严格模式
    在tsconfig.json里设置strict: true,它会强制你处理null和undefined,比如不允许把string | null直接赋值给string类型变量,从编译阶段就减少这类“自欺欺人”的操作。
  • 用可选链+空值合并简化处理
    针对可能为空的值,用?.和??优雅规避错误:
    const capitalisedName = name?.toUpperCase() ?? '';
    
    就算name是null或undefined,也不会报错,直接返回空字符串。

内容的提问来源于stack exchange,提问作者lynxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:01:01