如何合并两个带类型的Joi schema,实现继承并保留TypeScript类型安全?
报错原因
你遇到的类型报错是因为 basicSchema 已经绑定了 Basic 接口的类型约束,默认调用 .keys() 方法时会沿用 Basic 的类型校验,因此不允许传入接口中不存在的 firstName 字段。
解决方案
有两种常用的实现方式,都可以保留完整的类型安全:
方案1:给.keys()方法显式传入扩展后的接口泛型
Joi 的 .keys() 方法本身支持传入泛型覆盖原有类型,你只需要把扩展后的 User 接口和严格模式参数传入即可:
const userSchema = basicSchema.keys<User, true>({ firstName: Joi.string().min(1).required() });
这个方案适合基础schema已经包含自定义校验、默认值等复杂逻辑的场景,不需要修改原有基础schema的定义。
方案2:抽离基础配置复用生成新schema
如果你有大量继承自 Basic 的接口,更推荐把基础schema的字段配置单独抽离,生成新schema时直接展开复用:
// 抽离基础字段配置,提前做类型校验 const basicSchemaFields = { key: Joi.string().min(1).required() } satisfies Joi.PartialSchemaMap<Basic>; // 基础schema const basicSchema = Joi.object<Basic, true>(basicSchemaFields); // 扩展生成User schema const userSchema = Joi.object<User, true>({ ...basicSchemaFields, firstName: Joi.string().min(1).required() });
这个方式的灵活性更高,后续扩展其他子接口时只需要按需新增字段即可,类型校验完全符合预期。
内容的提问来源于stack exchange,提问作者forsstromerik
相关产品推荐
相关产品推荐

