代码风格指南:优先处理 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

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

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

相关推荐
triumph_passion8 天前
ESlint9学习记录(前端编码规范化/工程化)
代码规范
Synmbrf8 天前
说说平时开发注意事项
javascript·面试·代码规范
一只叫煤球的猫8 天前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Freedom风间9 天前
前端优秀编码技巧
前端·javascript·代码规范
方圆想当图灵10 天前
由 Mybatis 源码畅谈软件设计(七):SQL “染色” 拦截器实战
后端·mybatis·代码规范
这颗橘子不太甜QAQ10 天前
Husky使用技巧
javascript·git·代码规范
异常君10 天前
Java 高并发编程:等值判断的隐患与如何精确控制线程状态
java·后端·代码规范
异常君10 天前
Java 日期处理:SimpleDateFormat 线程安全问题及解决方案
java·后端·代码规范
异常君10 天前
线程池隐患解析:为何阿里巴巴拒绝 Executors
java·后端·代码规范
程序员韩立10 天前
在掘金(Juejin)上使用 Markdown、代码块和选择标签的一些关键点和技巧
代码规范