最稳妥的文件参数校验应明确契约、拒绝模糊输入。需直接检查file是否为null/undefined,结合instanceof File等类型判断,抛出带上下文的TypeError,避免静默兜底,用TypeScript和类型守卫强化防护,并通过测试覆盖边界情况。
直接检查 file 是否为 null 或 undefined,再结合类型判断(如 instanceof file 或 typeof file === 'object' && file?.name)是最稳妥的起点。关键不是“兜底”,而是让调用方明确知道该传什么、不传会怎样。
明确参数契约,拒绝模糊输入
工具方法不该替调用方做“猜测”。比如上传前校验函数,应要求传入标准 File 对象,而非接受 string、Blob、null 等混杂类型。
- 在 JSDoc 或 TypeScript 接口中写清:@param {File} file - 必须是浏览器原生 File 实例
- 方法开头立即做断言式校验:
if (!(file instanceof File)) throw new TypeError('Expected File object') - 避免写
file || fallbackFile这类静默兜底——它掩盖了调用错误,还可能让后续逻辑出错
提供清晰的错误提示和可选的预处理入口
当检测到非法输入时,不只抛错,还要告诉开发者哪里错了、怎么改。
- 错误信息包含上下文:例如
`Invalid file argument in uploadSizeCheck(): received ${typeof file}, expected File` - 若业务确实需要兼容非 File 类型(如从 input.files[0] 取值可能为 undefined),单独提供一个预处理工具,比如
normalizeFileInput(input),由调用方显式调用 - 不把“容错”逻辑塞进核心工具方法里,保持职责单一
用 TypeScript 做编译期防护
类型系统是第一道防线。定义参数为 file: File 后,TS 会阻止大部分未初始化或类型不符的调用。
- 对可选参数,用
file?: File显式声明,并在方法内区分处理路径 - 配合
strictNullChecks,避免file.name这类访问引发运行时错误 - 必要时导出类型守卫,例如
function isFile(obj: unknown): obj is File { return obj instanceof File },方便复用校验逻辑
测试覆盖边界情况
专门写测试验证各种“坏输入”是否被正确拦截,而不是侥幸通过。
- 测试
undefined、null、{}、new Blob()、空字符串等传入时是否抛出预期错误 - 测试合法
new File([''], 'test.txt')能正常执行 - CI 中确保这些测试失败时能立刻暴露问题,而不是等到上线后报错
不复杂但容易忽略:优雅不是让代码“忍着跑下去”,而是让错误尽早暴露、原因一目了然、修复路径清晰可见。


















