Joi

オブジェクトのバリデーション用の javascript ライブラリ。
https://github.com/hapijs/joi

Joi 自体は node.js 用だが、ブラウザ用のjoi-browserというものある。
https://github.com/jeffbski/joi-browser

導入

yarn add joi
yarn add -D @types/joi

TypeScript で使う

joi-browser には型定義ファイルがないが、joi の型定義を(ほぼ?)そのまま使えるようなので、TypeScript で使う場合は代わりに joi の型定義を使うように設定すると型の恩恵が得られる。

インストール:

yarn add joi-browser
yarn add -D @types/joi

tsconfig.jsonにパスのエイリアスを設定する。

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      /* joi-browserの型定義がないので代わりにjoiの型定義を使う */
      "joi-browser": ["node_modules/@types/joi/index.d.ts"]
    }
  }
}

これで、importできる。

import Joi from "joi-browser";

tsconfig.jsonの設定をしない場合は、次のようにrequireするしかない。

// 型の恩恵は得られない
const Joi = require("joi-browser");

使い方

スキーマを定義する

詳しくはここを参照。
Joi | API Reference

export const noteInsertedSchema = Joi.object().keys({
  // 数値型
  a: Joi.number() // 数値または数値に変換可能な文字列
    .integer() // 整数
    .min(0)
    .max(127)
    .required(),

  // 文字列型
  b: Joi.string().required()

  // 配列
  // Array<string | number>
  c: Joi.array().items(Joi.string(), Joi.number())

  // 他のプロパティの値によってスキーマを分岐する
  b: Joi.array()
    .when('a', {
      is: 1,
      then: Joi.array().items(Joi.string()),
    })
    .when('a', {
      is: 2,
      then: Joi.array().items(Joi.number()),
    })

  // uuid
  uuid: Joi.string().uuid({ version: 'uuidv4' }),
});