SPARQL のための型安全なバリデータをつくった
(タイトル通りとはおそれいった,という感じですが)SPARQL の問い合わせ結果が JSON で帰ってくるときに,そのデータを any
ではなく型安全に扱える方法を提案しています.最後の方にあるデモアプリケーションやバリデータそれ自体は TypeScript で実装されていますが,今回採用した JSON Typed Definition という規格を用いてスキーマを定義すれば,言語を問わず様々な場面で使用することが出来ます.JavaScript や Python においても型安全が保証されるのは,WEB システムやデータ分析においても強力な後押しとなることでしょう.
JTD によるスキーマ定義
sparqlQueryResult.jtd.json
としてスキーマを定義しました.その際に SPARQL 1.1 Query Results JSON Format | W3C Recommendation 21 March 2013 の和訳版を参照しています.また,スキーマを記述する際の規格としては,JSON Typed Definition [1] を採用しました.
sparqlQueryResult.jtd.json
Ajv による型安全なバリデータの生成
上述したスキーマ定義を schema.ts
としてスクリプト上に移植します.
schema.ts
schema.ts
内で const assertion されたことで,JSONResponseSchema
オブジェクトが NonWidening な Literal Types として得られました.
Ajv: JSON Validator
JavaScript における老舗 validator である Ajv は,この Literal Types を "いい感じに解釈して変換" する JTDDataType
という Utility Types を持っています.すなわち,JTDDataType
にリテラル化したスキーマ定義を渡してやるだけで,本来我々が必要としていた〈TypeScript における型定義〉および 〈型安全なバリデータ〉 [3]が手に入ることになります.やったぜ.
validator.ts
他の言語への流用
本記事では TypeScript にのみ焦点を当てましたが,JTD を採用して定義されたスキーマは他にも Python や Ruby, Java, Golang, C# 果てはRust といった言語にも転用することができます.これでフロントエンド側の TypeScript とバックエンド側の Java / Ruby / Go 等でも同じスキーマを使えますし,Python / C# / Rust 等でリクエストを投げてデータ分析する際にも,より型安全にハンドリングすることができるでしょう.
(※実装の詳細についてはこちらを参照のこと)
demo
-
ただし,ぜひとも標準機能としてほしいという声が多数あり,遠からず実現する可能性がある ↩︎
-
なお,ついでにパーサーとシリアライザも手に入るし,これらもまた型安全です ↩︎
Discussion