Итак, на данный момент мой код выглядит примерно так:
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(),
}),
});
Но моя проблема в том, что при определении поля userField
address
необязательно.
Как сделать так, чтобы при создании схемы требовался адрес поля?