Implement Joi in Typescript

Viewed 29486

Simple joi validation snippet in javascript.It will simply return an error object when validation fails.

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)

Now I am learning typescript and like to do the exact functionality in TS.I am aware that Joi is a javascript library but can we make use of it in Typescript.When exploring I came across some alternatives like https://github.com/joiful-ts/joiful.

I am curious to know if there is any straightforward approach using Joi directly in typescript. Or little bit of changes to make the Joi work exactly like in Javascript.

WHAT I TRIED

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})

While compiling, I got the error

Cannot find name 'Iterable'.

703 map(iterable: Iterable<[string | number | boolean | symbol, symbol]> | { [key: string]: symbol }): this;

UPDATE
I have installed @types/joi as suggested in the answer but still the same error

I am basically looking for validating string,boolean,number,array and object keys as it can be done easily with Joi in Javascript

4 Answers

Please change your import

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

And make sure you've installed the types by using

npm install --save-dev @types/joi

Type definitions for Joi exists: @types/joi or @types/hapi__joi (for joi version 17).

Add those to your package.json, and you should be able to use Joi with Typescript. Generally speaking you should not be downloading seperate libraries to make a package work in Typescript, some definitions should do

Try to use this code instead.

import * as Joi from "joi";

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

I hope you will manage to make it work.

I doubt that import * as Joi from "joi" is going to give you much joy. You are importing all exported members with that.

Is there an individual export you are wanting? Use import { IndividualExport } from "joi"

Is there a default export you are wanting? Use import Joi from "joi"

Also is there a reason you are calling Joi in the second example but not the first?

Related