设置验证的默认值

zha*_*hou 5 javascript node.js typescript hapijs joi

我正在使用Joi来验证我的node.js服务器中使用hapijs框架的服务的有效负载.它曾经看起来像这样(在我的打字稿代码以及编译成javascript后):

payload: {
    para1: Joi.number().required(),
    para2: Joi.string()
}
Run Code Online (Sandbox Code Playgroud)

现在我想设置两个参数的默认值.如果代码是用javascript编写的,我可以这样做:

payload: {
    para1: Joi.number().required().default(1),
    para2: Joi.string().default("defaultstring")
}
Run Code Online (Sandbox Code Playgroud)

我在swagger中测试了它,默认值实际上变成了我设置的值.

但是,我的项目是用打字稿编写的.我做了同样的事情并编译​​了打字稿代码.结果javascript看起来像这样:

 payload: {
    para1: Joi.number().required()["default"](1),
    para2: Joi.string()["default"]("defaultstring")
 }
Run Code Online (Sandbox Code Playgroud)

在招摇时,不应用默认值.

这是我的问题:

  1. 为什么代码在编译后会变得不同?
  2. 什么["default"]("defaultstring")意思,它做什么?
  3. 如何编写打字稿代码以确保它可以编译为 Joi.string().default("defaultstring")

更新

根据@ rsp的帖子,问题2中的格式只是访问对象属性的不同方式.我也可以从这里得到参考.但它没有解释它们是否有任何区别.有谁有想法吗?

UPDATE2

以下是访问JS属性的两种方式之间的区别.使用括号方式似乎没有负面影响.但是,在我的情况下,默认值不会反映在swagger上.将对它进行研究.

rsp*_*rsp 8

在 JavaScript 中:

required().default(1)
Run Code Online (Sandbox Code Playgroud)

与此相同:

required()["default"](1)
Run Code Online (Sandbox Code Playgroud)

因为您可以通过以下方式访问对象属性:

object["propertyName"]
Run Code Online (Sandbox Code Playgroud)

或者:

object.propertyName
Run Code Online (Sandbox Code Playgroud)

(在第二种情况下有一定的限制)。

因此,奇怪的是,如果不需要,TypeScript 会输出较长的样式,但同样奇怪的是,较长的样式与较短的样式的工作方式并不完全相同。

我会尝试手动将编译后的 JavaScript 更改为较短的版本,看看是否有帮助。如果没有,那么问题出在其他地方。我怀疑这不会有帮助。

应该.default()在 TypeScript 中工作,因为它是在@types/joi中定义的- 请参阅:

但另一方面却有这样的评论:

// TODO express type of Schema in a type-parameter (.default, .valid, .example etc)
Run Code Online (Sandbox Code Playgroud)

这可能表明.default()实施尚未准备好 - 请参阅:

还有这个问题:joi.d.ts out of date, missing types