You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个带类型的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:57:03