Можно ли создать эквивалент joi из машинописного интерфейса? - PullRequest
1 голос
/ 14 октября 2019

Итак, на данный момент мой код выглядит примерно так:

export interface IDCARD_TYPE {
  KTP = 'KTP',
  SIM = 'SIM',
}
export interface User {
   name: string;
   email: string;
   address?: string;
   idCard: { 
     type: IDCARD_TYPE;
     account: string;
   }
}

Из этого интерфейса мне нужны эквиваленты Joi, которые, по крайней мере, выглядят так:

const userSchema = joi.object().keys({
  name: joi.string(),
  email: joi.string(),
  address: joi.string(),
  idCard: joi.object().keys({
    type: joi.string(),
    account: joi.string(),
  }),
});

И это то, что я получил до сих пор:

export interface JoiGeneric<X> extends joi.ObjectSchema {
  keys(params: { [K in keyof X]: JoiOf<X[K]> }): this;
}

export function joiGeneric<X>(): JoiGeneric<X> {
   return joi.object() as JoiGeneric<X>;
}

export type  JoiOf<X> = X extends string ? joi.StringSchema :
X extends number ? joi.NumberSchema :
X extends Date ? joi.DateSchema :
X extends IAnyX ? joi.AnySchema : // this one can be ignored for now.
X extends object ? JoiGeneric<X> :
never

И я буду использовать это как:

const userSchema: JoiOf<User> = joiGeneric<User>().keys({
   name: joi.string().required(),
   email: joi.string().required(),
   // how can I make it so that address field is required here?
   idCard: joiGeneric<User['idCard']>().keys({
     type: joi.string().required(),
     account: joi.string().required(),
   }),
});

Но моя проблема в том, что при определении поля userFieldaddress необязательно.

Как сделать так, чтобы при создании схемы требовался адрес поля?

1 Ответ

0 голосов
/ 31 октября 2019

Если поле address является необязательным, я думаю, что в любом случае лучше определить поле и оставить строку пустой, когда в ней нет необходимости.

export interface User {
   name: string;
   email: string;
   address: string;
   idCard: { 
     type: IDCARD_TYPE;
     account: string;
   }
}

Я не поддерживаю необязательные поля, потому чтоони (1) требуют, чтобы разработчик написал больше кода для обработки ошибок, которые возникают, когда на поля ссылаются, но они не существуют;что, в свою очередь, увеличивает время, необходимое для разработки кода, размер исходного кода и время, необходимое для выполнения кода, и (2) создает несколько комбинаций объекта, которые, по моему мнению, должны действительно обрабатываться какновые типы.

...