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

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

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

相关推荐
MrSYJ3 天前
为什么引入springsecurity的依赖后,会自动创建了过滤器链
spring boot·后端·代码规范
用户47949283569154 天前
Biome:用 Rust 重构前端开发体验
前端·代码规范
是Dream呀5 天前
YOLOv10深度解析:革命性的实时目标检测技术
人工智能·代码规范
喝拿铁写前端6 天前
为什么数据变了界面却不动?——Vue / React / Angular 常见渲染“失效”场景全解析
前端框架·代码规范·响应式编程
乐予吕10 天前
别再乱用箭头函数了!JavaScript 三种函数写法的终极指南
前端·javascript·代码规范
BeerBear11 天前
你对Code Review的看法是什么?
后端·面试·代码规范
Jacob023411 天前
初识 Tailwind CSS:怎么用它高效写出“像没写过 CSS 一样”的页面
前端·css·代码规范
初生牛犊不怕苦12 天前
你的第一行代码printf没有你想那么简单
代码规范
探索为何12 天前
Transformer:从神坛到笑坛的华丽转身
设计模式·程序员·代码规范
tager12 天前
Vue 3 组件开发中的"双脚本"困境
前端·vue.js·代码规范