【问题标题】:Implement Joi in Typescript在 Typescript 中实现 Joi
【发布时间】:2020-02-13 01:11:30
【问题描述】:

javascript中的简单joi验证sn-p。验证失败时会简单地返回一个错误对象。

validate.js

const Joi =require("joi");

function validateObject (input) {
const schema = {
    key: Joi.string().required(),
  };
  return Joi.validate(input, schema);
};

let {error} = validateObject({key:5})
console.log(error)

现在我正在学习 typescript 并喜欢在 TS 中执行确切的功能。我知道 Joi 是一个 javascript 库,但我们可以在 Typescript 中使用它。在探索时我遇到了一些替代方案,例如 https://github.com/joiful-ts/joiful

我很想知道是否有直接在 typescript 中使用 Joi 的直接方法。或者做一些小改动,让 Joi 像在 Javascript 中一样工作。

我尝试了什么

validate.ts

import * as Joi from "joi";

export const validateObject = (input: object) => {
const schema = {
    home: Joi.string().required(),
  };
  return Joi.validate(input, schema);
};
validateObject({key:5})

编译时出现错误

找不到名称“Iterable”。

703 map(iterable: Iterable | { [key: string]: 符号 }): this;

更新
我已按照答案中的建议安装了@types/joi,但仍然出现同样的错误

我基本上是在寻找验证字符串、布尔值、数字、数组和对象键,因为它可以在 Javascript 中使用 Joi 轻松完成

【问题讨论】:

  • 您可以在此处添加您的tsconfig.json 或您可能正在使用的任何其他tsc 选项吗?我不认为这是joi 问题,而只是配置问题。同时确认您的typescript 版本。
  • 您使用的是什么版本的 joi?您的代码在版本 14 的 stackblitz 上运行良好:stackblitz.com/edit/typescript-ccvxmy

标签: javascript typescript joi


【解决方案1】:

请更改您的导入

-const Joi =require("joi");
+import Joi from "joi";

并确保您已通过使用安装了类型

npm install --save-dev @types/joi

【讨论】:

  • joi 提供了自己的类型定义。所以,不需要安装@types/joi
【解决方案2】:

存在 Joi 的类型定义:@types/joi@types/hapi__joi(对于 joi 版本 17)。

将这些添加到您的 package.json 中,您应该能够将 Joi 与 Typescript 一起使用。一般来说,您不应该下载单独的库来使包在 Typescript 中工作,一些定义应该这样做

【讨论】:

  • 是的,安装了@types。但是当我尝试运行代码时,我得到了错误Cannot find name 'Iterable'. 703 map(iterable: Iterable<[string | number | boolean | symbol, symbol]> | { [key: string]: symbol }): this;
  • 我做了一个 npm i @types/joi 。但是上面的错误存在
  • 安装@types/joi 后如何使用Joi?目前,我可以在我的 package.json 中看到 @types/joi
【解决方案3】:

我怀疑import * as Joi from "joi" 会给你带来很多快乐。您正在导入所有导出的成员。

您是否需要单独的导出?使用import { IndividualExport } from "joi"

是否有您想要的默认导出?使用import Joi from "joi"

您在第二个示例中调用 Joi 而不是第一个示例是否还有原因?

【讨论】:

  • 抱歉 joi() 打错了
  • 但我在编译时遇到了不同的错误,Cannot find name 'Iterable'. 703 map(iterable: Iterable<[string | number | boolean | symbol, symbol]> | { [key: string]: symbol }): this;
  • import joi from 'joi' 真的可以解决问题。然后像往常一样使用joi.validate()。你运行的是哪个版本? 14.3.1 在通过该方法导入和使用时对我来说效果很好。另外,我不确定它是否会有所帮助,但也许可以尝试 const schema = joi.object({ key: joi.string().required() }) 为您的架构?
猜你喜欢
  • 2020-05-26
  • 2020-04-27
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2021-12-29
  • 2020-11-03
  • 1970-01-01
  • 2021-07-20
相关资源
最近更新 更多