オプションのプロパティと未定義の値を持つプロパティは似ているように見えますが、根本的に異なります。オブジェクトがプロパティを欠いている場合、それにアクセスすると未定義が返されます。同様に、プロパティが存在してもその値が明示的に未定義である場合、それにアクセスしても未定義が返されます。しかし、in 演算子は根本的な違いを明らかにします。プロパティが存在しない場合は value in object は false になり、未定義の値を持つプロパティが存在する場合は true になります。TypeScript では、? で示されるオプションのプロパティは、そのプロパティがオブジェクトに存在しない可能性があることを意味します。この違いは、プロパティを省略することが「変更なし」を意味するが、明示的に未定義に設定することが異なる意図を示す API にとって重要です。exactOptionalPropertyTypes コンパイラオプションは、この違いを強制し、| undefined が明示的に型に追加されない限り、オプションのプロパティへの未定義の明示的な代入を許可しません。この正確な型付けは、プロパティの存在が意味的な意味を持つ設定オブジェクトや更新メカニズムに役立ちます。たとえば、更新関数は省略されたフィールドを無視するかもしれませんが、未定義に設定されたフィールドは異なる方法で処理する可能性があります。この違いを理解することは、堅牢な API 設計と正確なオブジェクト操作にとって不可欠です。
in演算子は根本的な違いを明らかにします。プロパティが存在しない場合はvalue in objectは false になり、未定義の値を持つプロパティが存在する場合は true になります。TypeScript では、?で示されるオプションのプロパティは、そのプロパティがオブジェクトに存在しない可能性があることを意味します。この違いは、プロパティを省略することが「変更なし」を意味するが、明示的に未定義に設定することが異なる意図を示す API にとって重要です。exactOptionalPropertyTypesコンパイラオプションは、この違いを強制し、| undefinedが明示的に型に追加されない限り、オプションのプロパティへの未定義の明示的な代入を許可しません。この正確な型付けは、プロパティの存在が意味的な意味を持つ設定オブジェクトや更新メカニズムに役立ちます。たとえば、更新関数は省略されたフィールドを無視するかもしれませんが、未定義に設定されたフィールドは異なる方法で処理する可能性があります。この違いを理解することは、堅牢な API 設計と正確なオブジェクト操作にとって不可欠です。