javascript - 设置验证的默认值

标签 javascript node.js typescript hapi.js joi

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

payload: {
    para1: Joi.number().required(),
    para2: Joi.string()
}

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

payload: {
    para1: Joi.number().required().default(1),
    para2: Joi.string().default("defaultstring")
}

我大摇大摆地测试了一下,默认值竟然变成了我设置的值。

但是,我的项目是用 typescript 写的。我做了同样的事情并编译​​了 typescript 代码。结果 javascript 如下所示:

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

在 swagger 中,不应用默认值。

这是我的问题:

  1. 为什么编译后代码不一样?
  2. ["default"]("defaultstring") 是什么意思,它有什么作用?
  3. 如何编写 typescript 代码以确保它可以编译为 Joi.string().default("defaultstring")

更新

根据@rsp 的帖子,问题 2 中的格式只是访问对象属性的不同方式。我也从 here 获得引用.但这并不能解释它们是否有任何区别。有人知道吗?

更新2

Here是两种访问 JS 属性的方式的区别。使用括号方式似乎没有负面影响。但是,就我而言,默认值并未反射(reflect)在 swagger 上。将对此进行研究。

最佳答案

在 JavaScript 中:

required().default(1)

与此相同:

required()["default"](1)

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

object["propertyName"]

或:

object.propertyName

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

所以奇怪的是 TypeScript 在不必要的情况下会输出较长的样式,但同样奇怪的是较长的样式与较短的样式并不完全相同。

我会尝试手动将已编译的 JavaScript 更改为较短的版本,看看是否有帮助。如果没有,则问题出在其他地方。我怀疑它无济于事。

.default() 应该在 TypeScript 中工作,因为它在 @types/joi 中定义。 - 见:

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

// TODO express type of Schema in a type-parameter (.default, .valid, .example etc)

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

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

关于javascript - 设置验证的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008975/

相关文章:

javascript - 如何在 onchange 之前从下拉列表中获取先前选择的值

javascript - 我的递归函数的 Big-O 分析是什么?

node.js - DDD 和 Node.js : Good practice to have a repository with async callbacks?

javascript - "SyntaxError: Unexpected token *"在 firebase 函数中使用 got(npm) 时

typescript - 环境命名空间 typescript 示例

javascript - Node.js:一次接收太多 UDP 消息,丢失它们

javascript - PUG:无法将对象传递到脚本中

javascript - 在惰性模块之间共享惰性模块组件的最佳方式

Typescript - 带参数的箭头函数

javascript - 是否可以在不运行服务器的情况下像使用 PHP 文件一样使用 Node.js?