代码风格指南:优先处理 Default、空值、异常值(开始主逻辑之前,先处理所有可能出错的情况)

在日常开发中,代码的可读性和健壮性往往来自于对默认值、空值、异常值的优先处理 。本文介绍一种在 TypeScript 项目中推荐遵循的代码风格习惯:先处理边界,再处理主干逻辑


为什么要优先处理 default / 空值 / 异常值?

  • ✅ 提高可读性:开发者可以一眼看到函数的边界处理和默认分支。
  • ✅ 减少嵌套:避免"层层 if/else"结构。
  • ✅ 提升健壮性:在进入核心逻辑前,先过滤掉不符合预期的值。
  • ✅ 易于测试:异常分支逻辑更加清晰、独立。

函数中优先 return 空值/异常值

反例的写法:

kotlin 复制代码
function calculateDiscount(price?: number): number {
  if (price != null) {
    if (price > 100) {
      return price * 0.9;
    }
    return price;
  }
  return 0;
}

推荐写法:

kotlin 复制代码
function calculateDiscount(price?: number): number {
  if (isNil(price)) return 0;
  if (price > 100) return price * 0.9;
  return price;
}

switch 结构中把 default 放在最前面

反例的写法:

arduino 复制代码
switch (status) {
  case 'success':
    return handleSuccess();
  case 'fail':
    return handleFail();
  default:
    return handleUnknown();
}

推荐写法:

arduino 复制代码
switch (status) {
  default:
    return handleUnknown();
  case 'success':
    return handleSuccess();
  case 'fail':
    return handleFail();
}

正则表达式前先判断空值

typescript 复制代码
function matchPhone(input?: string): boolean {
  if (isNil(input)) return false;
  return /^1\d{10}$/.test(input);
}

表单校验中优先判断空值并 return

typescript 复制代码
const validator = (_: any, value: string) => {
  if (isNil(value)) return Promise.reject('不能为空');
  if (!/^\d+$/.test(value)) return Promise.reject('只能是数字');
  return Promise.resolve();
};

三元运算符中优先判断空值

推荐写法:

ini 复制代码
const display = isNil(value) ? '-' : value;

Vue 模板中:

scss 复制代码
{{ isNil(price) ? '-' : priceFormat(price) }}

接口数据处理默认值

ini 复制代码
const productName = isNil(data.productName) ? '未知商品' : data.productName;
const stock = isNil(data.stock) ? 0 : data.stock;

封装为函数:

r 复制代码
function safeValue<T>(value: T | null | undefined, fallback: T): T {
  return isNil(value) ? fallback : value;
}

数组操作前判断空值

ini 复制代码
return isNil(list) ? [] : list.map(item => item.name);

可选链:

ini 复制代码
return list?.map(item => item.name) ?? [];

表单初始值处理

go 复制代码
const formModel = reactive({
  amount: props.amount ?? 0,
  type: props.type ?? 'default',
});

对象解构时设置默认值

ini 复制代码
const {
  page = 1,
  pageSize = 10,
  keyword = '',
} = props.options ?? {};

computed 中优先判断非法值

scss 复制代码
const formattedAmount = computed(() =>
  isNil(data.amount) || isNaN(data.amount) ? '-' : priceFormat(data.amount)
);

事件处理函数中优先判断边界值

javascript 复制代码
function onSubmit(formData: FormData) {
  if (isNil(formData)) {
    console.warn('无效的表单数据');
    return;
  }
  if (!formData.name) {
    message.error('请输入名称');
    return;
  }
  // 正常处理逻辑...
}

Vue 组件中 props 防御性处理

ini 复制代码
defineProps<{
  show: boolean;
  count?: number;
}>();

const safeCount = computed(() => {
  return isNil(props.count) ? 0 : props.count;
});

接口调用前预校验参数合法性

javascript 复制代码
async function fetchUser(id?: string) {
  if (isNil(id) || id.trim() === '') {
    console.error('用户 ID 不能为空');
    return;
  }
  const res = await api.get(`/user/${id}`);
  return res.data;
}

小结:常见场景推荐方式

场景 推荐做法
接口字段处理 isNil 判断,设定默认值
三元表达式展示 isNil(value) ? fallback : value
解构参数 使用 ?? 设置默认值
数组操作前判断 isNil(array) ? [] : array.map(...)
computed 中 computed(() => isNil(val) ? fallback : format(val))
表单/事件校验 if (isNil(x)) return 再逻辑
组件 prop 默认值 prop.value ?? fallback

请记住这条原则:在开始主逻辑之前,先处理所有可能出错的情况。

这不仅是一个风格建议,更是一种让你写出更安全、稳定、好维护代码的方式。

相关推荐
To_OC1 天前
万字解析《JS 语言精粹》之第五章:继承 5 大核心精髓(JS 原型核心)
前端·javascript·代码规范
Coffeeee2 天前
闲聊几句,Android老哥们,你们多久没做技改需求了
android·程序员·代码规范
饼干哥哥2 天前
扣子3.0测评:我让 Codex 和 Claude Code 住同一个桌面,结果它们打架了!
人工智能·开源·代码规范
码哥字节4 天前
为什么 Claude Code 读你的代码库,光靠 embedding 根本不够?
claude·代码规范
kisshyshy6 天前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
用户6919026813399 天前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范
Cosolar10 天前
藏在 Claude Code 里的极致浪漫:完整 187 条 Spinner Verbs 全收录
后端·程序员·代码规范
Mickey86110 天前
MCP 加持下的零代码逆向:全自动化绕过 APP 验签与加密实战
代码规范
专注VB编程开发20年14 天前
WebView2 + HostObject 架构的核心痛点 ——强耦合、同步阻塞、异常连锁、内核绑定
代码规范