9
votes

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

3
Can you add your tsconfig.json here or any other tsc options you might be using? I don't think this is a joi problem and is just a configuration problem. Also confirm your typescript version. - Cuthbert
What version of joi were you using? Your code works just fine on stackblitz with version 14: stackblitz.com/edit/typescript-ccvxmy - alexandru

3 Answers

6
votes

Please change const Joi =require("joi"); to import Joi from "joi"; and make sure you've installed the types by using npm install @types/joi --save-dev

2
votes

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

0
votes

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?