函数校验 vs 完全信任参数

完全信任参数

function add(a, b) {
    return a + b;
}

add(1, 2);        // 3
add("1", "2");    // "12"(字符串拼接,非预期但不会报错)
add(1);           // NaN(b 为 undefined)
add(1, 2, 3);     // 3(多余参数被忽略)
  • 错误往往在深层调用或结果使用时才暴露,难以定位
function getUserName(user) {
    return user.name.toUpperCase();  // user 为 null 时直接崩溃
}

函数校验

  • 函数入口处主动检查参数
function add(a, b) {
    if (typeof a !== "number" || typeof b !== "number") {
        throw new TypeError("add: 参数必须是数字");
    }
    return a + b;
}
add("1", "2");  // 抛出 TypeError,错误立刻暴露

常见校验手段

// 1. typeof / instanceof
if (typeof a !== "number") throw new TypeError(...);

// 2. 空值判断
if (a == null) throw new Error("a 不能为空");

// 3. 参数个数
if (arguments.length < 2) throw new Error("需要 2 个参数");

// 4. 默认值兜底(不算严格校验,但能防 undefined)
function add(a = 0, b = 0) { return a + b; }

更好的方案:用 TypeScript

  • 编译期就约束参数
function add(a: number, b: number): number {
    return a + b;
}

add(1, 2);      // ✅
add("1", "2");  // ❌ 编译报错