🦾

SPARQL のための型安全なバリデータをつくった

2021/11/27に公開

(タイトル通りとはおそれいった,という感じですが)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 オブジェクトが NonWideningLiteral Types として得られました.

Ajv: JSON Validator

JavaScript における老舗 validator である Ajv は,この Literal Types を "いい感じに解釈して変換" する JTDDataType という Utility Types を持っています.すなわち,JTDDataType にリテラル化したスキーマ定義を渡してやるだけで,本来我々が必要としていた〈TypeScript における型定義〉および 〈型安全なバリデータ[3]が手に入ることになります.やったぜ.

validator.ts

他の言語への流用

本記事では TypeScript にのみ焦点を当てましたが,JTD を採用して定義されたスキーマは他にも PythonRuby, Java, Golang, C# 果てはRust といった言語にも転用することができます.これでフロントエンド側の TypeScript とバックエンド側の Java / Ruby / Go 等でも同じスキーマを使えますし,Python / C# / Rust 等でリクエストを投げてデータ分析する際にも,より型安全にハンドリングすることができるでしょう.

(※実装の詳細についてはこちらを参照のこと)

https://jsontypedef.com/docs/implementations

demo

脚注
  1. RFC 8927 (Experimental) ↩︎

  2. ただし,ぜひとも標準機能としてほしいという声が多数あり,遠からず実現する可能性がある ↩︎

  3. なお,ついでにパーサーとシリアライザも手に入るし,これらもまた型安全です ↩︎

GitHubで編集を提案

Discussion