なんで上記のようなことをするかというと、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 することで、配列かどうか探索できます。
もっといい方法などあれば、再度書き直しますね
コメント