yytypescript / book

TypeScriptの入門書『サバイバルTypeScript』
https://typescriptbook.jp
939 stars 103 forks source link

オプショナルチェーンの説明で「「オブジェクトのプロパティが存在しない」」→「オブジェクト自体が存在しない」 #846

Closed TamagawaJousui closed 3 months ago

TamagawaJousui commented 6 months ago

https://github.com/yytypescript/book/edit/master/docs/reference/values-types-variables/object/optional-chaining.md

JavaScriptのオプショナルチェーン?.は、オブジェクトのプロパティが存在しない場合でも、エラーを起こさずにプロパティを参照できる安全な方法です。

「オブジェクトのプロパティが存在しない」ではなく、「オブジェクト自体が存在しない(nullundefinedとなる)」だと思います。

t-yng commented 4 months ago

@TamagawaJousui 提案ありがとうございます。

MDN: オプショナルチェーン (?.)

接続されたオブジェクトチェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします。

と記載があるように、オプショナルチェーンの目的としはnullishなプロパティへの参照を安全に行う仕組みの提供なのかなと思っていました。

そのため、元の「オブジェクトのプロパティが存在しない」という表現の方が、個人的には自然かなと思いました。🙆🏻‍♂️

「オブジェクト自体が存在しない(nullやundefinedとなる)」の方が良い理由について、少し具体的に教えていだいてもよいでしょうか?🙏🏻

t-yng commented 4 months ago

ただ、次のようなコードの場合は、参照元のオブジェクトに対してオプショナルチェーンでチェックをする形になるので、こういった文脈では「オブジェクトが存在しない」という表現とも言えるかもですね!

type Animal = {
  name: string;
}

function showName(animal: Animal | undefined) {
  console.log(animal?.name);
}
TamagawaJousui commented 3 months ago

@t-yng ご返信ありがとうございます。

「オブジェクトのプロパティが存在しない」の場合は、エラーが出なくで、通常のプロパティアクセサーの様に、undefined が返します。

image

「オブジェクト自体が存在しない」の場合、エラーが出ます。

image

つまり、オプショナルチェーンの目的は、「nullishなオブジェクトのプロパティへの参照」を安全にする為だと思います。

MDNの原文では、

オプショナルチェーン (optional chaining) 演算子 (?.) は、接続されたオブジェクトチェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします。

ここで、チェーン内の各参照というのは、最後のプロパティではなく、チェーンの途中の各オブジェクトだと思います。

t-yng commented 3 months ago

@TamagawaJousui ご説明ありがとうございます!

「オブジェクト自体が存在しない」の場合、エラーが出ます。 つまり、オプショナルチェーンの目的は、「nullishなオブジェクトのプロパティへの参照」を安全にする為だと思います。

ここの説明を見ていて思ったのですが、 オブジェクトのプロパティ とだけ言っているので、今回の違和感が発生している気がしました。

オプショナルチェーンの評価対象はあくまで 変数オブジェクトのプロパティ になるのかなと思っており、「オブジェクト自体が存在しない(nullundefinedとなる)」という表現だと「オブジェクト自体がnullundefinedとなる」という意味にも取れてしまい少し混乱を招きそうな感じがしました。

※ 実際にオブジェクトは代入された値なので、nullやundefinedになるのはオブジェクトではなく変数やオブジェクトのプロパティなどの何かしらの参照のかなと思いました。

なので「オブジェクトのプロパティ」に限定せずに「存在しない」という言葉も使わずに「変数やオブジェクトのプロパティなどの参照がnullやundefinedの場合でも...」という説明だと @TamagawaJousui さんのモヤッとも解消されて、スッキリするかもと思ったのですが、いかがでしょうか?

検討違いなこと言ってしまっていたら、ご指摘ください。🙇‍♂️

TamagawaJousui commented 3 months ago

@t-yng ご返信ありがとうございます。

ご提案は素晴らしいと思います。そして、「変数やオブジェクトのプロパティなどの参照がnullやundefinedの場合」の方がいかがでしょうか。前回述べた通り、変数若しくはプロパティ自体が nullish の場合は、エラーは起きないですから。

どうぞよろしくお願いします。

t-yng commented 3 months ago

@TamagawaJousui ありがとうございます!

そして、「変数やオブジェクトのプロパティなどの参照がnullやundefinedの場合」の方がいかがでしょうか。前回述べた通り、変数若しくはプロパティ自体が nullish の場合は、エラーは起きないですから。

確かに訂正して頂いた↑の表現が一番しっくり来ますね!!

もし可能でしたら、修正のプルリク作成して頂けると嬉しいです😊

TamagawaJousui commented 3 months ago

@t-yng 遅くなりすみませんでした。

先程プルリクを作成しました、ご確認の程よろしくお願いします。