2.6 KiB
2.6 KiB
2026-08-06 工作日志
TypeScript enum 重构(全量消除 enum)
用户决定改用纯联合类型,自行修改依赖方。全项目 18 处 enum 分两类处理:
改为纯联合类型(字符串枚举,仅作类型用)
Attachment.tsAttachmentBizType、Template.tsTemplateBizTypeModel.tsRunEnv / OrderType / ImageType(ImageType 值为 ir-auto 等,与 key 不同)Comment.tsCommentReplyBizType / CommentBizTypeUser.tsUserAttachType(在 UserAPI.ts 有值引用,已同步改为字符串字面量,import 改 type-only)
改为 const 对象 + 派生类型(数字枚举或运行时值引用,纯联合不可行)
User.tsLoginType、Article.tsArticleType / ArticleAttachType / ArticleSoftwareDownloadType / ArticleSoftwareRuntime(数字枚举,保留数值避免破坏数据契约)deviceStore.tsBreakpoints(数字,用于比较 width < Breakpoints.SM)IOSize.tsUnit(用 Object.keys/values + Unit.KB 值引用)Prismjs.tsPrismjsType / PrismjsViewer(Map 键值引用)directives/Popup.tsPopupType(switch case 值引用)
结论
vue-tsc --noEmit通过(exit 0)- ESLint 因项目缺 eslint.config.js(仍用旧 .eslintrc,ESLint9 不支持)无法运行,属项目既有配置问题
- 判断依据:纯联合无运行时存在,凡
Object.keys(enum)、map.set(Enum.X)、case Enum.X、Enum.X作值的都无法纯联合,必须 const 对象
Storage.ts 设计修正
getString返回string | null(对齐localStorage.getItem契约),不再 throwgetJSON返回unknown,键不存在时返回null,值无法解析时才抛错getObject返回T | null,不再 throw(修正原 JSDoc 已写T | undefined但代码 throw 的矛盾)is/not键不存在时自然返回false/true,不再崩has去掉死代码!== undefined(localStorage.getItem 只返回 string|null),单次查询vue-tsc --noEmit通过
Toolkit.ts debounce 修复
- Bug 修复:
cancel()原先只清定时器不重置leading状态,导致立即模式下 cancel 后首次调用丢失 leading 触发 - 类型修复:返回类型从
T & { cancel(): void }改为((...args: Parameters<T>) => void) & { cancel(): void },防抖函数实际返回 void 而非 T 的返回值 - 补充完整 JSDoc(含
@example),说明立即模式(leading + trailing)和延迟模式(trailing only)的行为差异 - 状态变量
immediate→leading,参数defaultImmediate→immediate,语义更清晰 - 去掉
eslint-disable-next-line和多余注释 vue-tsc --noEmit通过