P粉9577231242023-07-29 09:49:07
おっしゃる通りです。TypeScript では、変数型に存在するかどうか不明なプロパティにはアクセスできません。型が共用体型の場合、TypeScript でアクセスできるようにするには、そのプロパティが共用体型のすべてのメンバーに存在する必要があります。
しかし、さまざまな方法で変数の型を減らすことができます。たとえば、最初に値が true かどうかを確認し、そうでない場合、TypeScript は共用体の型を ValidationError のみに絞り込みます。
通常、別のオプションは in 演算子を使用することですが、この場合、共用体型にはオブジェクト型以外のものが含まれるため、TypeScript ではそれが許可されません。
カスタムのタイプ ガードを定義することもできます (または、ライブラリが提供するタイプ ガードが存在する場合はそれを使用します)。ただし、この単純なケースでは、必要な作業量が少し大きすぎるように思えます。 。
TypeScript ドキュメントで詳細を説明したように、型を縮小する他の方法もあります。おっしゃる通り、typeof演算子の結果を確認するのも方法の一つです。
この例では、型ガードを実装するのではなく、型ガードが存在することを宣言するだけですが、各メソッドを使用して結果変数の型を絞り込む方法を次に示します。
これらは通常は避けるのが最善ですが、TypeScript をキーワードとして使用して型アサーションを行うこともできます。
これらの型アサーションの使用を避けることが最善の理由は、ある型を別の型として扱うように TypeScript に指示しているためです。したがって、これを行うと、タイプ セーフティが犠牲になる可能性があります。
ただし、TypeScript コンパイラーよりも状況をよく理解している場合、これは、より多くの情報を提供するために使用できるツールです。
個人的には、型アサーションが使用された理由を説明し、その安全性の基礎となる仮定について言及するコメントを常に残すことが役立つと考えています。
また、この場合、型アサーションを使用してプロパティをチェックしても、結果変数の型は絞り込まれないため、このアプローチはニーズに正確に適合しない可能性があります。