打字稿扩展对象并排除日期类型

时间:2019-12-29 22:57:40

标签: typescript

是否可以从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

1 个答案:

答案 0 :(得分:1)

如果您要的是FormValues[Key] extends object & not Date之类的negated type-他们还没有出来。

您可以添加一个条件步骤来检查DateDate是子类型/比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

Playground