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
相关产品推荐
相关产品推荐

