8
5

More than 5 years have passed since last update.

unknownにはtypescript-json-validatorを使うべし。ファイナルアンサー!

Last updated at Posted at 2019-09-04

typescript-json-validatorとは

TypeScriptの型定義からJSON Schemaを作成し、それをもとに型チェックを行うライブラリです
https://www.npmjs.com/package/typescript-json-validator

何がすごいのか?

TypeScriptの型定義はかなり強力で、TypeScriptに閉じた世界では型制約のある素敵な暮らしを送ることができます。

しかし、JSONファイルからの読み出しや、外部からのAPIコールなどで入力がunknownになった瞬間幸せな暮らしは崩れ去ります。JavaScript由来の型の弱さに涙しつつ型チェックを行わない限り、string型に仮に配列が入っていてもTypeScriptは何もしてくれてないのです。

typescript-json-validatorはこの状態を劇的に改善してくれます。型定義Hogeに対して、isHogeというJSON Schemaベースのバリデータを生成することができるため、下記のように安全なコードを書けるようになります。

ちなみに、型制約にマッチしない際に詳細付きで例外を投げることもできます。

if(isHoge(obj)){
// objはHoge型である保証があり、型制約が効く
}
else if(isFuga(obj)){
// objはFuga型である保証があり、型制約が効く
}

これだよ、皆が探し求めていたワンピースは、、、

例を追記

型を定義

実際には結構複雑な型定義にも対応しています。

types/ExampleNumber.ts
type ExampleNumber = number

export default ExampleNumber
types/ExampleString.ts
type ExampleString = string

export default ExampleString
types/ExampleObject.ts
type ExampleObject = {
    text: string
}

export default ExampleObject

バリデータは自動生成

yarn typescript-json-validator types/ExampleNumber.ts
yarn typescript-json-validator types/ExampleString.ts
yarn typescript-json-validator types/ExampleObject.ts

あとはコードからバリデータを参照

is<型名>という関数がエキスポートされているので、それを使うと下記のようにコードを書けます。

index.ts
import {isExampleNumber} from "./types/ExampleNumber.validator";
import {isExampleObject} from "./types/ExampleObject.validator";
import {isExampleString} from "./types/ExampleString.validator";

for (const obj of ["aaa", 123, {text: "hoge"}, {key: "fuga"}]) {
    if (isExampleString(obj)) {
        console.log(`${obj} isExampleString uppercase is ${obj.toUpperCase()}`)
    } else if (isExampleNumber(obj)) {
        console.log(`${obj} isExampleNumber`)
    } else if (isExampleObject(obj)) {
        console.log(`${JSON.stringify(obj)} isExampleObject key=${obj.key}`)
    } else {
        console.log(`${JSON.stringify(obj)} is unknown `)
    }
}

型バリデータを自分で書くのは昭和までだよね。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5