検索

ホームページ  >  に質問  >  本文

JavaScript には、プリミティブ型の「プロパティ」が存在するかどうかをチェックできるオブジェクト ラッパーがあります。では、TypeScript もこのように動作させるにはどうすればよいでしょうか?

<p>XMLValidator.validate の戻り値は true または ValidationError (完全に正確ではありません。更新を参照してください) のいずれかで、ValidationError には err 属性があります。 </p> <pre class="brush:php;toolbar:false;">validate(xmlData: string, options?: validationOptionsOptional): true | ValidationError</pre> <p>JavaScript はオブジェクト ラッパーを使用してブール プリミティブ値を表すため、err 属性が存在するかどうかをチェックすることで検証が成功したかどうかを知ることができます。 </p> <pre class="brush:php;toolbar:false;">const result = XMLValidator.validate(message) if (result.err) { // ts で動作させるにはどうすればよいですか? console.log(`無効な XML) } それ以外 { console.log(`XML) }</pre> <p>しかし、TypeScript ではこれを行うことはできません。属性 'err' は "true" 型に存在しませんというエラーが報告されます。 </p><p>戻り値の型を最初にチェックするという考えは、冗長であり、実際には戻り値の型の定義がないため、好きではありません (私の更新を参照してください)。 TypeScript コードをできるだけ簡潔に記述するにはどうすればよいですか? </p><p>--- 更新 ---</p><p>さらに validator.js のコードを確認してみました。 </p>


<pre class="brush:php;toolbar:false;">const isValid = validateAttributeString(attrStr, options); if (isValid !== true) { getErrorObject(...) を返します。 } ... function getErrorObject(コード、メッセージ、行番号) { 戻る { エラー: { コード: コード、 msg: メッセージ、 行: lineNumber.line || lineNumber, 列: lineNumber.col、 }、 }; }</pre> <p>つまり、ここでは if (typeof result == "boolean") しか使用できないようですが、私の質問に対する「普遍的な」解決策があることを願っています。 </p>
P粉797855790P粉797855790495日前492

全員に返信(1)返信します

  • P粉957723124

    P粉9577231242023-07-29 09:49:07

    おっしゃる通りです。TypeScript では、変数型に存在するかどうか不明なプロパティにはアクセスできません。型が共用体型の場合、TypeScript でアクセスできるようにするには、そのプロパティが共用体型のすべてのメンバーに存在する必要があります。

    しかし、さまざまな方法で変数の型を減らすことができます。たとえば、最初に値が true かどうかを確認し、そうでない場合、TypeScript は共用体の型を ValidationError のみに絞り込みます。

    通常、別のオプションは in 演算子を使用することですが、この場合、共用体型にはオブジェクト型以外のものが含まれるため、TypeScript ではそれが許可されません。

    カスタムのタイプ ガードを定義することもできます (または、ライブラリが提供するタイプ ガードが存在する場合はそれを使用します)。ただし、この単純なケースでは、必要な作業量が少し大きすぎるように思えます。 。

    TypeScript ドキュメントで詳細を説明したように、型を縮小する他の方法もあります。おっしゃる通り、typeof演算子の結果を確認するのも方法の一つです。

    この例では、型ガードを実装するのではなく、型ガードが存在することを宣言するだけですが、各メソッドを使用して結果変数の型を絞り込む方法を次に示します。

    リーリー

    TypeScript プレイグラウンド


    これらは通常は避けるのが最善ですが、TypeScript をキーワードとして使用して型アサーションを行うこともできます。

    これらの型アサーションの使用を避けることが最善の理由は、ある型を別の型として扱うように TypeScript に指示しているためです。したがって、これを行うと、タイプ セーフティが犠牲になる可能性があります。


    リーリー

    ただし、TypeScript コンパイラーよりも状況をよく理解している場合、これは、より多くの情報を提供するために使用できるツールです。

    個人的には、型アサーションが使用された理由を説明し、その安全性の基礎となる仮定について言及するコメントを常に残すことが役立つと考えています。

    また、この場合、型アサーションを使用してプロパティをチェックしても、結果変数の型は絞り込まれないため、このアプローチはニーズに正確に適合しない可能性があります。

    返事
    0
  • キャンセル返事