扩展Yup DateLocale支持自定义compareToday函数遇类型问题求助
解决Yup扩展DateLocale添加自定义校验本地化的类型问题
核心问题在于你没有正确扩展Yup内置的DateLocale接口,而是错误地在LocaleObject里重新定义了date字段,导致类型合并失败。以下是修复方案:
1. 正确扩展DateLocale接口
直接在模块声明中扩展DateLocale,而不是覆盖LocaleObject中的date属性。因为LocaleObject的date字段本身就是DateLocale类型,扩展DateLocale后会自动合并到LocaleObject中。
修改你的类型扩展代码:
import { DateLocale, Message, Maybe, AnyObject, Flags } from "yup"; import { YupCompareTodayOp } from "#src/localization/yup/types"; declare module "yup" { // 保留已生效的DateSchema扩展 interface DateSchema< TType extends Maybe<Date> = Date | undefined, TContext = AnyObject, TDefault = undefined, TFlags extends Flags = "", > { compareToday(op: YupCompareTodayOp, message?: string): this; } // 直接扩展DateLocale,添加compareToday本地化字段 interface DateLocale { compareToday?: Message<{ path: string; op: YupCompareTodayOp }>; } }
2. 正常使用setLocale设置本地化消息
现在setLocale中的date对象会自动识别compareToday字段,类型检查不再报错:
setYupLocale({ date: { compareToday: ({ path, op }) => ({ key: "common:validations.date.compareToday", values: { path, op }, }), max: ({ max, path }) => ({ key: "common:validations.date.max", values: { path, max }, }), }, });
为什么原来的写法不行?
你之前在LocaleObject里重新定义date字段的操作,会覆盖Yup原生的DateLocale类型,而不是合并。TypeScript的模块扩展规则是:对于接口,同名接口会自动合并,但如果在LocaleObject里重新声明date属性,相当于重新定义该属性的类型,而不是扩展它。
额外注意
确保这段类型扩展代码在项目中被正确加载(比如放在全局类型文件global.d.ts中,或者在导入Yup的文件之前导入),这样TypeScript才能正确识别扩展后的类型。
内容的提问来源于stack exchange,提问作者Kendall
相关产品推荐
相关产品推荐

