🐥

JSON.parseはなぜanyを返すのか

2024/06/19に公開

はじめに

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を返すことによって使い勝手がとても悪くなる

ここまで読んでいただいた型、ありがとうございました!
もしよければいいねをよろしくおねがいします!

GitHubで編集を提案

Discussion