JSON.parseはなぜanyを返すのか
はじめに
TypeScriptを始めた頃からanyは悪だと教わってきましたが、それなのになぜanyを返すんだ!?
なぜJSON.parseがanyを返すのか気になったので、原因を調べたり推測しました。
anyを使うのは本当に適切?
なぜanyを返すかを調査する前に、TypeScriptのanyとunknownについておさらいしましょう。
-
any
どのような値でも代入を許す型、コンパイラーが型チェックを行わない型
私は後者の意味が重要だと考えています。 -
unknown
TypeScript 3.0から導入された対象の値の型が何かわからないときに使用する型
unknownの値を絞り込むことによって型安全に使用することができます。
kyのresponse.json
少し話が逸れてしまいますが、ここでkyというFetchをより使いやすくしたライブラリの話をします。
kyでは、レスポンスのコンテンツをjsonにして返す関数を提供しています。
この関数は、anyではなくunknownを返します。
内部で行っている処理は似たような物のはずですし、なぜJSON.parseではanyを使用するのでしょうか?
今の状態
VSCodeで確認する限り、JSON.parseは第一引数に対象となるtextを受け取り、any型でObjectにparseしたものを返却します
ChatGPTが考えるJSON.parseがanyを返す理由
最初から最終手段みたいで申し訳ないんですが、これ以外に思いつかず聞いてみました。
ふむふむ、柔軟性については何となく理解できます。
anyで返すのはどうなの?とも思いますし、unknownで返ってきても面倒な時があるよなと葛藤します。
そして、今回の話の根幹になるであろう話が出てきました。
unknown型はTypeScript実装当初に存在しない
私はすっかり実装当初からunknown型が存在していたと思っていました。
unknown型が存在しないとなれば、消去法でanyとなるのも納得できます。
ChatGPTが考えるunknownを返さない理由
なるほど、、
互換性を保つ為であったり、使い勝手を保つ為にunknown型を使用しないようです。
多くの開発者はJSON.parseの戻り値を自分で適切に管理する能力があります。
この文章がすべてですよね。
まとめ
JSON.parseがanyを返し、unknownを返さない理由は大きくまとめて2つのようです。
- TypeScript実装当初、unknown型は存在しない。実装後も互換性の問題があった
- unknownを返すことによって使い勝手がとても悪くなる
ここまで読んでいただいた型、ありがとうございました!
もしよければいいねをよろしくおねがいします!
Discussion