@ TypeScript有識者の方
これがエラーにならないの、なぜでしょうか…?
Conversation
Notices
-
sublimer@あすてろいどん鯖管 (sublimer@mstdn.sublimer.me)'s status on Thursday, 23-May-2024 17:45:15 JST sublimer@あすてろいどん鯖管 -
sublimer@あすてろいどん鯖管 (sublimer@mstdn.sublimer.me)'s status on Thursday, 23-May-2024 17:51:32 JST sublimer@あすてろいどん鯖管 -
Masaki Hara (qnighy@qnmd.info)'s status on Thursday, 23-May-2024 17:51:32 JST Masaki Hara @sublimer f1に渡す前の配列式の型を見ると、この時点でkey2が消えているのがわかります。つまり、 { key2?: number} → {} → { key2?: string } という変換をたどっていることになります。
In conversation permalink なちか@4月まで社畜 repeated this. -
Masaki Hara (qnighy@qnmd.info)'s status on Thursday, 23-May-2024 17:51:32 JST Masaki Hara @sublimer これはTypeScriptの著名な非健全性のひとつです。TypeScriptにおけるオブジェクトリテラル型は一義的には「言及されていないキーについては不明」と見なすのが正式と考えられますが、これを正直に運用しているとつらい部分があるためあえて妥協したルールになっている場所があります。それは、optional propertyを増やす形でのキャストです。TypeScriptでは、このようなキャストは安全なことが多いことからasを使わずに許可しています。しかし、総合的に見れば最初に挙げたように一度プロパティを減らしてからまた増やす変換により不健全な例を構成できます。
In conversation permalink なちか@4月まで社畜 repeated this. -
Masaki Hara (qnighy@qnmd.info)'s status on Thursday, 23-May-2024 17:55:00 JST Masaki Hara @sublimer 最初に配列を統合したときにkey2が消えるのは、オブジェクトリテラル型の本来の解釈に基づくものと考えると正当化されます。value1[*]はkey2を宣言していませんが、宣言していないということはこの名前のプロパティについて何も情報を持っていないということです。value2[*]はkey2を宣言しているものの、不明な型と明らかな型を混ぜたら不明な型として扱うしかありません。これはanyとnumberを混ぜたらanyになるのと似たような考え方で、自然な帰結です。
In conversation permalink
-