是否可以从Date
类型中排除object
类型。我在表单中有以下错误类型。但是我遇到了一个问题,其中Date
类型是object
的一部分。
export type FieldErrors<FormValues> = {
[Key in keyof FormValues]?: FormValues[Key] extends any[]
? FormValues[Key][number] extends object
? FieldErrors<FormValues[Key][number]>[]
: FieldError
: FormValues[Key] extends object // this is the issue bit when extend object
? FieldErrors<FormValues[Key]>
: FieldError
};
type FormData = {
stringField: string;
numberField: string;
dateField: Date;
};
{errors.dateField && errors.dateField.message} // This result in error because Date type is object
答案 0 :(得分:1)
如果您要的是FormValues[Key] extends object & not Date
之类的negated type-他们还没有出来。
您可以添加一个条件步骤来检查Date
。 Date
是子类型/比object
更具体的类型,因此此步骤应在FormValues[Key] extends object
检查之前进行。
一个好的规则是从最具体到最一般。这是一个示例:
interface FieldError { message: string }
export type FieldErrors<FormValues> = {
[Key in keyof FormValues]?: FormValues[Key] extends any[]
? FormValues[Key][number] extends object
? FieldErrors<FormValues[Key][number]>[]
: FieldError
: FormValues[Key] extends Date // add conditional check for Date
? FieldError
: FormValues[Key] extends object // ... before object check
? FieldErrors<FormValues[Key]>
: FieldError
};
/*
type MyFormErrors = {
stringField?: FieldError | undefined;
numberField?: FieldError | undefined;
dateField?: FieldError | undefined;
}
*/
type MyFormErrors = FieldErrors<FormData>
declare const errors: MyFormErrors
errors.dateField && errors.dateField.message // FieldError.message: string