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

TypeScript函数是否应在运行时检查必填参数是否存在?

TypeScript运行时参数校验的困惑

TypeScript不提供运行时保障,我一直在纠结该在何处检查函数参数的存在性。

场景1:完全信任TypeScript类型定义

假设someRequiredParam永远不会是undefined或null,写出如下代码:

function myFunc(someRequiredParam: { foo: string, bar: string }) {
  return JSON.stringify(someRequiredParam);
}

这段代码在编译时完全正常,但一旦运行时传入不符合预期的值,就可能直接崩溃。

场景2:给必填参数加运行时检查

如果不信任TypeScript的编译时校验,给标记为必填的参数添加运行时检查:

function myFunc(someRequiredParam: { foo: string, bar: string }) {
  if (isText(someRequiredParam?.foo) && isText(someRequiredParam?.bar)) {
    return JSON.stringify(someRequiredParam);
  }
}

但既然已经将参数标记为必填,再添加这些检查又显得冗余,违背了类型定义的初衷。

场景3:将参数改为可选类型

为了适配运行时检查,干脆把参数及其嵌套属性都定义为可选类型:

function myFunc(someRequiredParam?: { foo?: string, bar?: string }) {
  if (isText(someRequiredParam?.foo) && isText(someRequiredParam?.bar)) {
    return JSON.stringify(someRequiredParam);
  }
}

可这样又完全失去了开发/编译阶段的强类型校验,显然不合理。

场景4:调用函数前检查参数

另一种思路是在传递参数给函数前提前检查值是否存在,但完全依赖调用方的规范同样不妥,无法从根源上避免问题。

对比其他类型系统

我觉得像ReScript这类拥有可靠类型系统的语言会更省心——它们会强制开发者处理TS/JS中类似null/undefined的场景,编译后的代码不会出现这类运行时错误。

但我很好奇:

  • 大家在使用TypeScript时,是如何避免它仅在编译时捕获错误带来的虚假安全感?
  • 是否普遍大量使用类型守卫?
  • 会不会在函数内部用类型守卫检查必填参数在运行时是否存在?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:05:32