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型である保証があり、型制約が効く
}
これだよ、皆が探し求めていたワンピースは、、、
例を追記
型を定義
実際には結構複雑な型定義にも対応しています。
type ExampleNumber = number
export default ExampleNumber
type ExampleString = string
export default ExampleString
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<型名>という関数がエキスポートされているので、それを使うと下記のようにコードを書けます。
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 `)
}
}
型バリデータを自分で書くのは昭和までだよね。