JsonValueObject か JsonValueArray かを判定する。

なんで上記のようなことをするかというと、Json を扱っていたときにデータがオブジェクトであるか配列であるかで、型を any として扱うかどうかが決まってくるからです。

せっかく TypeScript を使うのなら、なるべく any でキャストはしたくないなと

目次

使用環境

node v16.14.2
Library ta-json

JsonObject かどうかを判定する。

かなり地道な方法なのですが、実務で困っていたためにメモ代わりに書きます。

const validateObject = (json: JsonValue): JsonValueObject => {
  if (
    json instanceof Array ||
    typeof json === 'string' ||
    typeof json === 'number' ||
    typeof json === 'boolean' ||
    typeof json === null ||
    typeof json === undefined
  ) {
    return undefined;
  }
  return json;
};

// 使用時
validateObject(data)

要はその、すべての方の可能性を排除した上で何を返すか判定すればよくて、絞りに絞り込んで Object だったら json をそのまま返すようにすればいいと思います。
他にいい案などあればコメントください。

JsonValueArray

Array の場合も Object と同様で問題ないのですが、1 点違いがあります。

const validateArray = (json: JsonValue): JsonValueArray => {
  if (
    typeof json === 'string' ||
    typeof json === 'number' ||
    typeof json === 'boolean' ||
    typeof json === null ||
    typeof json === undefined
  ) {
    return [];
  }
  return Array.isArray(json) ? json : [];
};

validateArray(data)

なぜか json の中身が配列の状態であっても、typeof json === “object”が true になってしまうんですよね〜
object は Json なんとかとか区別しないからですかね、ちょっと理由がよくわかりません。
そのために、Array.isArray(json)などで Array か判定してから return することで、配列かどうか探索できます。

もっといい方法などあれば、再度書き直しますね

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

数学科出身のSoftware Engineer
情報通信が好きなのでブログを活用して発信しています。

コメント

コメントする

目次
閉じる