所以,现在我的代码看起来像这样
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
是可选的。
如何使创建架构时需要字段地址?
最佳答案
如果address
字段是可选的,我认为最好还是定义该字段,并在不需要时将字符串留空。
export interface User {
name: string;
email: string;
address: string;
idCard: {
type: IDCARD_TYPE;
account: string;
}
}
我不赞成可选字段,因为它们(1)要求开发人员编写更多代码来处理字段被引用但不存在时发生的错误;这反过来又增加了开发代码所需的时间、源代码的大小以及运行代码所需的时间,并且(2)生成一个对象的多种组合,在我看来,这实际上应该被处理为新类型。
关于javascript - 是否可以从 typescript 接口(interface)创建一个等效的 joi ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58370467/