把业务对象写成严格的 TS 类型:区分可空、用联合类型收窄、避免 any 与过宽的可选字段。
前端项目类型定义、接口契约、重构老代码的类型。
帮我设计 TypeScript 类型。 【业务对象】{{业务对象}} 【数据来源】{{数据来源}} 【约束】{{已知约束}} 【环境】{{运行环境}} 输出: 1. 类型定义代码(可直接放进 types.ts),要求: - 状态类字段用字面量联合类型,不要用 string - 金额、ID 用带注释的 branded type 或至少用注释标明单位 - 区分「不存在」与「暂时为空」:前者用可选,后者用 null,并在注释里说明 - 时间字段统一用 ISO 字符串还是时间戳,明确一种 - 嵌套结构拆成独立 interface,避免超长内联 - 数组字段用 readonly 或 ReadonlyArray(如果不应被就地修改) 2. 3 个类型工具:从主类型派生出「创建入参」(去掉服务端生成字段)、「更新入参」(全可选但保留类型)、「列表项摘要」(Pick 子集)。 3. 运行时校验:给一份 zod(或手写 guard)校验器,覆盖必填、枚举、数字范围、嵌套数组。 4. 反例清单:列出 5 种「看起来能用但会埋坑」的写法(any、Object、可选字段全塞一个类型、枚举用 string、把后端字段名直接当业务名),每种给一句改法。 5. 迁移建议:如果这段类型要替换现有松散类型,给出分步改法(先加类型、再收窄、最后删 any)。 代码要求:不加多余注释,但每个字段一行行尾注释说明含义与单位。
临时可以,但必须留 TODO 和收窄计划,否则会扩散。
涉及 ID 混用和金额单位时值得,成本很低收益很高。