Closed TamagawaJousui closed 3 months ago
@TamagawaJousui 提案ありがとうございます。
接続されたオブジェクトチェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします。
と記載があるように、オプショナルチェーンの目的としはnullishなプロパティへの参照を安全に行う仕組みの提供なのかなと思っていました。
そのため、元の「オブジェクトのプロパティが存在しない」という表現の方が、個人的には自然かなと思いました。🙆🏻♂️
「オブジェクト自体が存在しない(nullやundefinedとなる)」の方が良い理由について、少し具体的に教えていだいてもよいでしょうか?🙏🏻
ただ、次のようなコードの場合は、参照元のオブジェクトに対してオプショナルチェーンでチェックをする形になるので、こういった文脈では「オブジェクトが存在しない」という表現とも言えるかもですね!
type Animal = {
name: string;
}
function showName(animal: Animal | undefined) {
console.log(animal?.name);
}
@t-yng ご返信ありがとうございます。
「オブジェクトのプロパティが存在しない」の場合は、エラーが出なくで、通常のプロパティアクセサーの様に、undefined
が返します。
「オブジェクト自体が存在しない」の場合、エラーが出ます。
つまり、オプショナルチェーンの目的は、「nullishなオブジェクトのプロパティへの参照」を安全にする為だと思います。
MDNの原文では、
オプショナルチェーン (optional chaining) 演算子 (?.) は、接続されたオブジェクトチェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします。
ここで、チェーン内の各参照というのは、最後のプロパティではなく、チェーンの途中の各オブジェクトだと思います。
@TamagawaJousui ご説明ありがとうございます!
「オブジェクト自体が存在しない」の場合、エラーが出ます。 つまり、オプショナルチェーンの目的は、「nullishな
オブジェクト
のプロパティへの参照」を安全にする為だと思います。
ここの説明を見ていて思ったのですが、 オブジェクトのプロパティ
とだけ言っているので、今回の違和感が発生している気がしました。
オプショナルチェーンの評価対象はあくまで 変数
や オブジェクトのプロパティ
になるのかなと思っており、「オブジェクト自体が存在しない(null
やundefined
となる)」という表現だと「オブジェクト自体がnull
やundefined
となる」という意味にも取れてしまい少し混乱を招きそうな感じがしました。
※ 実際にオブジェクトは代入された値なので、nullやundefinedになるのはオブジェクトではなく変数やオブジェクトのプロパティなどの何かしらの参照のかなと思いました。
なので「オブジェクトのプロパティ」に限定せずに「存在しない」という言葉も使わずに「変数やオブジェクトのプロパティなどの参照がnullやundefinedの場合でも...」という説明だと @TamagawaJousui さんのモヤッとも解消されて、スッキリするかもと思ったのですが、いかがでしょうか?
検討違いなこと言ってしまっていたら、ご指摘ください。🙇♂️
@t-yng ご返信ありがとうございます。
ご提案は素晴らしいと思います。そして、「変数やオブジェクトのプロパティなどの参照がnullやundefinedの場合」の方がいかがでしょうか。前回述べた通り、変数若しくはプロパティ自体が nullish
の場合は、エラーは起きないですから。
どうぞよろしくお願いします。
@TamagawaJousui ありがとうございます!
そして、「
変数やオブジェクトのプロパティなどの参照がnullやundefinedの場合」の方がいかがでしょうか。前回述べた通り、変数若しくはプロパティ自体が nullish の場合は、エラーは起きないですから。
確かに訂正して頂いた↑の表現が一番しっくり来ますね!!
もし可能でしたら、修正のプルリク作成して頂けると嬉しいです😊
@t-yng 遅くなりすみませんでした。
先程プルリクを作成しました、ご確認の程よろしくお願いします。
https://github.com/yytypescript/book/edit/master/docs/reference/values-types-variables/object/optional-chaining.md
「オブジェクトのプロパティが存在しない」ではなく、「オブジェクト自体が存在しない(
null
やundefined
となる)」だと思います。