javascript - 是否可以从 typescript 接口(interface)创建一个等效的 joi ?

标签 javascript typescript typescript-typings typescript-generics

所以,现在我的代码看起来像这样

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/

相关文章:

javascript - 什么是 typescript 数字范围

node.js - browser.d.ts 对 Edge Web 扩展 API browser.runtime.* 的依赖

javascript - 获取 jQuery 的 .on() 数据对象中的 $(this) 访问权限?

javascript - 将 div 或 span 附加到下拉列表

javascript - jQuery 不更改选择选项的文本

javascript - 是否可以在 Map() 中存储自定义对象?

javascript - 在 Angular 中链接可观察订阅的最佳方式?

javascript - jQuery:使用 CSS3 而不是 JavaScript 制作动画

javascript - typescript 提示显式类型没有索引签名

typescript - 安装 typings 后刷新 VSC 中的错误