Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implement Joi in Typescript

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

like image 385
Sathya Narayanan GVK Avatar asked Oct 16 '19 09:10

Sathya Narayanan GVK


3 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
like image 165
Zakthedev Avatar answered Oct 17 '22 05:10

Zakthedev


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.

like image 42
Quentin Grau Avatar answered Oct 17 '22 05:10

Quentin Grau


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

like image 3
Phillip Avatar answered Oct 17 '22 05:10

Phillip