本文解析 ImportantDays 项目中的Constants.ets常量文件探讨枚举定义、接口设计、常量管理策略以及如何通过集中的类型系统提升代码可维护性和类型安全性。一、Constants 文件的定位Constants.ets是项目的类型字典集中定义了所有枚举、接口和常量。它的价值在于统一引用所有模块从同一处导入常量类型安全接口定义确保数据结构一致易于维护修改常量只需改一处代码文档通过命名和注释传达业务含义二、枚举定义ViewTypeEnum日历视图类型exportenumViewTypeEnum{YEAR,// 年视图MONTH,// 月视图WEEK,// 周视图DAY// 日视图}虽然目前只使用了YEAR和MONTH但预留了WEEK和DAY为未来扩展做准备。SortTypeEnum排序方式exportenumSortTypeEnum{DATE_ASC,// 按日期升序DATE_DESC,// 按日期降序CREATE_TIME// 按创建时间}三种排序方式覆盖了常见需求DATE_ASC即将到来的在前DATE_DESC最远的在前CREATE_TIME最近添加的在前枚举的设计考量使用enum而非常量字符串的优势// 使用 enum项目采用sortTypeSortTypeEnum.DATE_ASC// 类型安全// 使用常量字符串sortTypeDATE_ASC// 容易拼写错误三、常量定义日历相关exportconstWEEK_DAYS7;exportconstMONTH_NAMES:string[][一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月];exportconstWEEK_NAMES:string[][日,一,二,三,四,五,六];exportconstCALENDAR_SWIPER_COUNT3;常量值用途WEEK_DAYS7一周天数MONTH_NAMES中文月份名预留目前用 dayjs 格式化WEEK_NAMES中文星期名星期标题行CALENDAR_SWIPER_COUNT3Swiper 缓存页数存储相关exportconstSTORAGE_KEY_IMPORTANT_DAYSimportant_days_list;exportconstNOTIFICATION_CHANNEL_IDimportant_days_reminder;常量值用途STORAGE_KEY_IMPORTANT_DAYSimportant_days_listPreferences 存储键NOTIFICATION_CHANNEL_IDimportant_days_reminder通知渠道 ID布局相关exportconstCOMMON_PADDING12;exportconstCOMMON_PADDING_SMALL8;exportconstCOMMON_PADDING_LARGE16;统一的间距常量确保全应用布局一致。目前这些常量定义了但未广泛使用各组件直接写了数值是未来重构的方向。颜色exportconstDEFAULT_COLOR#FF6B6B;默认颜色为红色与主题色一致。四、接口定义TabItemexportinterfaceTabItem{title:string;icon:Resource;activeIcon:Resource;}Tab 配置接口预留了图标支持。目前MainEntry的tabBuilder只用了文字但此接口为图标扩展做好准备。ViewTypeItemexportinterfaceViewTypeItem{type:ViewTypeEnum;name:string;}视图类型配置项用于CalendarPage的视图切换按钮privategetViewTypes():ViewTypeItem[]{return[{type:ViewTypeEnum.YEAR,name:年},{type:ViewTypeEnum.MONTH,name:月}];}StatsexportinterfaceStats{total:number;upcoming:number;past:number;today:number;}统计信息接口定义了四种统计数据结构。ImportantDayJSONexportinterfaceImportantDayJSON{dayID:string;title:string;targetDate:number;// 时间戳isCountdown:boolean;color:string;reminderEnabled:boolean;reminderDaysBefore:number;note:string;isPinned:boolean;createTime:number;// 时间戳}序列化接口定义了ImportantDay持久化时的 JSON 结构。与 ImportantDay 类的区别特性ImportantDayImportantDayJSONtargetDateDatenumber时间戳createTimeDatenumber时间戳装饰器ObservedV2Trace无用途运行时使用持久化存储五、类型系统在项目中的应用枚举的使用// 排序LocalsortBy:SortTypeEnumSortTypeEnum.DATE_ASC;// 视图类型TraceviewType:ViewTypeEnumViewTypeEnum.MONTH;// switch 分支switch(sortType){caseSortTypeEnum.DATE_ASC:...caseSortTypeEnum.DATE_DESC:...caseSortTypeEnum.CREATE_TIME:...}接口的使用// Stats 接口getStats():Stats{return{total:this.allDays.length,upcoming:this.getUpcomingDays().length,past:this.getPastDays().length,today:this.getTodayDays().length};}// ViewTypeItem 接口ForEach(this.getViewTypes(),(item:ViewTypeItem){Text(item.name).fontColor(this.vm.viewTypeitem.type?#FFFFFF:#666666)})// ImportantDayJSON 接口toJSON():ImportantDayJSON{return{...};}六、常量管理的最佳实践1. 命名规范// 常量全大写 下划线exportconstWEEK_DAYS7;exportconstSTORAGE_KEY_IMPORTANT_DAYSimportant_days_list;// 枚举PascalCaseexportenumViewTypeEnum{...}exportenumSortTypeEnum{...}// 接口PascalCaseexportinterfaceStats{...}exportinterfaceTabItem{...}2. 注释规范/** 日历视图类型 */exportenumViewTypeEnum{/** 年视图 */YEAR,/** 月视图 */MONTH,...}每个枚举和枚举值都有注释便于理解。3. 分组组织常量按功能分组视图相关ViewTypeEnum、ViewTypeItem日历相关WEEK_DAYS、MONTH_NAMES、WEEK_NAMES存储相关STORAGE_KEY_IMPORTANT_DAYS通知相关NOTIFICATION_CHANNEL_ID布局相关COMMON_PADDING系列数据相关Stats、ImportantDayJSON七、改进建议1. 颜色常量集中管理目前DEFAULT_COLOR在Constants.ets而PRESET_COLORS在ImportantDay.ets。建议统一// Constants.etsexportconstDEFAULT_COLOR#FF6B6B;exportconstPRESET_COLORS:string[][...];2. 布局常量推广使用目前COMMON_PADDING等常量未被广泛使用建议各组件统一引用// 替代直接写数字.padding({left:COMMON_PADDING_LARGE,right:COMMON_PADDING_LARGE})3. 颜色主题化可以定义颜色主题exportinterfaceAppTheme{primary:string;secondary:string;background:string;textPrimary:string;textSecondary:string;textHint:string;}exportconstLIGHT_THEME:AppTheme{primary:#FF6B6B,secondary:#4ECDC4,background:#FFFFFF,textPrimary:#333333,textSecondary:#666666,textHint:#999999};八、总结Constants.ets的设计体现了以下原则集中管理所有常量和类型定义在一处类型安全使用枚举和接口确保类型正确语义清晰命名和注释传达业务含义预留扩展枚举预留未来值接口预留未来字段分组有序按功能分组便于查找常量文件是项目的契约定义了各模块之间共享的数据结构和约定其设计质量直接影响项目的可维护性。