TypeScript定义模型类能否避免使用?可选属性 有何最佳实践?
关于TypeScript模型类可选属性的问题解答
可以避免使用?可选属性标记的实现方案
完全不需要给所有属性加可选标记就能实现无参创建实例,常用两种实现方式:
- 给构造函数参数设置默认值
给每个属性设置业务逻辑里合理的初始默认值,无参调用构造函数时会自动填充默认值,同时所有属性的类型都是确定的非可选类型,不会携带undefined类型:export class Company { constructor( public id: number = 0, public name: string = '', public shortName: string = '' ) {} } // 无参调用完全合法,不会报错 this.editDataItem = new Company(); - 拆分模型定义和编辑态类型
如果你不希望给模型加固定默认值,只想在新增、编辑的临时占位场景下允许属性为空,可以用TS内置的Partial工具类型单独定义占位变量的类型,模型类本身保持纯必选属性,不会污染正常业务流程的类型判断:// 模型类本身保持必选属性,符合正常业务逻辑下的字段规则 export class Company { constructor( public id: number, public name: string, public shortName: string ) {} } // 组件内的编辑变量用Partial包裹,允许所有属性暂时为空 editDataItem: Partial<Company> = {}; // 提交数据前做完整的字段校验,再转成合法的Company实例 const submitData = new Company(editDataItem.id!, editDataItem.name!, editDataItem.shortName!);
当前写法的合理性评估
如果你的业务场景中Company实例本身就允许所有属性为空,那当前写法是合理的。但绝大多数业务场景下,正常的Company实例属性都是有有效值的,全可选的写法会导致所有用到Company实例的地方,TS都会提示属性可能为undefined,需要额外做空值判断,反而增加了代码冗余,也提高了运行时空值报错的风险。
这类场景的最佳实践
- 优先给模型属性设置合理默认值:如果空实例的属性有明确的初始值(比如数字类型默认0,字符串默认空字符串),优先用默认值替代可选标记,保证模型类型的纯粹性,也减少后续的空值判断代码。
- 临时占位场景用
Partial单独处理:如果只有编辑、新增的临时占位场景需要空实例,不要修改模型本身的定义,用Partial<Company>这类工具类型单独定义占位变量的类型,提交数据前统一做字段校验,保证正常业务流程中的Company实例都是符合类型定义的全量实例。 - 空实例需要明确识别的场景用联合类型:如果逻辑里需要明确判断一个实例是不是空占位,可以定义联合类型做区分,比所有属性都是undefined更易维护:
type CompanyInstance = Company | { isEmpty: true }; // 用类型守卫判断 if ('isEmpty' in companyInstance) { // 空实例的处理逻辑 }
内容的提问来源于stack exchange,提问作者derstauner
相关产品推荐
相关产品推荐

