TypeScript 5.x 装饰器与类型体操在复杂表单验证中的应用

TypeScript 5.0 正式支持了 TC39 标准装饰器,结合强大的条件类型,可以写出兼具类型安全与声明式风格的代码。

function Required(target: any, context: ClassFieldDecoratorContext) {
  return function (initialValue: any) {
    if (initialValue == null) throw new Error('Field is required');
    return initialValue;
  };
}

配合 Zod 或 Valibot 做运行时输入推断,可以做到「一套校验 Schema,兼具运行时拦截与编译期类型推导」。大家现在表单验证更倾向于手写 schema 还是装饰器?

24 回复 241 浏览
编辑于 6 days ago

全部回复

24 条
  • 孙维杰12 days ago

    请教一下楼主,在 Nuxt 4 中如果有大量的服务端并发请求,你们的 Nitro 引擎内存开销如何控制?

    孙维杰12 days ago

    请问层主能不能详细分享一下具体的配置或者落地细节?很感兴趣!

    王云帆8 days ago

    哈哈确实,这个坑我也踩过,层主总结得太精准了。

  • 周立恒12 days ago

    PostgreSQL 的 JSONB 配合 GIN 索引确实香,直接帮我们砍掉了一个 MongoDB 实例。

    张可晗10 days ago

    请问层主能不能详细分享一下具体的配置或者落地细节?很感兴趣!

    徐子墨9 days ago

    感谢层主的经验分享,这就去按照这个思路优化一下试一试!

  • 陈铁生12 days ago

    干货满满,已转发给部门的前端和后端同学们学习。

  • 郑婉清11 days ago

    受教了,关于图片占位防 CLS 抖动那部分,你们是用自建图片服务还是 CDN 动态缩放?

    张可晗10 days ago

    同感!特别是第 2 点,深有体会,以前走过不少弯路。

  • 徐子墨10 days ago

    请教一下楼主,在 Nuxt 4 中如果有大量的服务端并发请求,你们的 Nitro 引擎内存开销如何控制?

  • 王云帆10 days ago

    太详实了!正好我们在做老项目的技术栈迁移,BFF 层的隔离思路给了很大启发。

    李晓明7 days ago

    非常受启发,学到了!

  • 李晓明10 days ago

    写得通俗易懂!收藏了,准备下周在团队内部的技术分享会上重点推荐。

  • 周立恒10 days ago

    对于微前端,我们后来也全面拥抱了 Module Federation,比 iframe 的体验好太多了。

  • 徐子墨9 days ago

    RESTful + BFF 确实是最舒服的组合,GraphQL 在权限细粒度控制上太难维护了。

  • 孙维杰8 days ago

    哈哈,看到这个总结深有共鸣,踩过同样的坑。

  • 张可晗8 days ago

    赞同,TypeScript 复杂的类型体操虽然酷炫,但团队新人阅读成本也确实高,保持克制最重要。

  • 张可晗7 days ago

    对于微前端,我们后来也全面拥抱了 Module Federation,比 iframe 的体验好太多了。

  • 张可晗7 days ago

    支持一下!另外问下在多端数据聚合时,有没有遇到过分布式链路追踪 TraceId 丢失的问题?

  • 吴天昊7 days ago

    PostgreSQL 的 JSONB 配合 GIN 索引确实香,直接帮我们砍掉了一个 MongoDB 实例。

    郑婉清6 days ago

    完全同意层主的看法!我们团队在实践中也是这么处理的。

  • 王云帆7 days ago

    非常赞同第二点,双 Token 轮换加上黑名单撤销机制,才是无状态会话的最稳妥解法。

  • 周立恒7 days ago

    支持一下!另外问下在多端数据聚合时,有没有遇到过分布式链路追踪 TraceId 丢失的问题?

  • 沈凌风6 days ago

    太详实了!正好我们在做老项目的技术栈迁移,BFF 层的隔离思路给了很大启发。

登录后就能参与这个讨论。

环球论坛 Sweep The Globev0.1.0

基于现代化全栈架构构建的技术社区 · 开放、连接与分享

Nuxt 4Spring Boot 3PostgreSQLRedis