【发布时间】:2020-02-10 16:56:30
【问题描述】:
所以,现在,我的代码看起来像这样
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 是可选的。
如何在创建架构时使字段地址为必填项?
【问题讨论】:
标签: javascript typescript typescript-typings typescript-generics