推荐三种默认值设置方式:一是解构赋值配合??/||运算符,轻量简洁;二是工厂函数封装条件逻辑,适合复杂推导;三是Class构造器+init方法,便于扩展与类型约束。

直接在对象初始化时嵌入默认值逻辑,比单独写配置函数更简洁、可读性更强,也更容易维护。
用解构赋值 + 逻辑运算符设置默认值
这是最常用也最轻量的方式,适合基础类型或简单判断场景。
-
利用
||或??:前者对假值(如0、''、false)也会触发默认;后者只在null或undefined时生效,更安全 - 结合解构写法:在函数参数或对象创建时直接定义默认行为
例如:
const createPerson = ({ name, age, role } = {}) => ({
name: name ?? '匿名用户',
age: age ?? 18,
role: role || 'member', // 允许空字符串但不希望是 undefined
});
用工厂函数封装带条件逻辑的默认值
当默认值依赖其他字段、需校验、或要执行异步/复杂计算时,把逻辑收进一个函数里更清晰。
- 函数内部可访问所有传入字段,做联动判断(比如
status影响priority默认值) - 返回完整对象,避免外部反复补漏
- 便于单元测试和复用
例如:
const createUser = (input = {}) => {
const { email, isStaff, createdAt } = input;
const now = new Date();
return {
email: email?.trim() || 'no-email@example.com',
isStaff: Boolean(isStaff),
role: isStaff ? 'admin' : 'user',
createdAt: createdAt instanceof Date ? createdAt : now,
id: `usr_${Date.now()}`,
};
};
用 class 构造器 + 初始化方法统一管理默认策略
适合需要实例方法、生命周期钩子,或默认值逻辑随状态变化的中大型对象。
- 构造器接收原始数据,
init()或私有方法集中处理默认值推导 - 可调用外部服务(如查用户配置中心)、读取环境变量、合并 schema 定义
- 支持 getter/setter 对默认值做响应式控制
例如:
class Config {
constructor(raw = {}) {
this._raw = raw;
this.init();
}
init() {
const { timeout, retries, endpoint } = this._raw;
this.timeout = timeout ?? (import.meta.env.PROD ? 5000 : 3000);
this.retries = retries ?? (endpoint?.includes('staging') ? 2 : 1);
this.endpoint = endpoint || '/api/v1';
}
}
配合 TypeScript 类型守卫增强默认值可靠性
光有运行时逻辑还不够,加上类型提示能提前暴露配置缺失或类型错位问题。
- 用
Partial描述输入,用完整接口描述输出,TS 会强制你覆盖所有必填字段 - 自定义类型守卫函数(如
isValidEmail)可在默认值赋值前过滤无效值 - 联合类型 +
as const可约束默认字面量取值范围
例如:
type User = {
id: string;
name: string;
status: 'active' | 'inactive' | 'pending';
};
const normalizeUser = (input: Partial<User>): User => ({
id: input.id ?? `tmp_${Math.random().toString(36).slice(2, 9)}`,
name: input.name?.trim() || '新用户',
status: (input.status === 'active' || input.status === 'inactive')
? input.status
: 'pending',
});

















