検索

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

配列要素が未定義を返す可能性を考慮していない Typescript コード

<p>次のコードは Typescript 型チェッカー (v2.9.1) に渡しますが、実行時に <code>TypeError</code> をスローします。 </p> <pre class="brush:php;toolbar:false;">インターフェース項目 { id: string } const リスト: アイテム[] = [{ id: 'a' }, { id: 'b' }]; const item = list[3]; // タイプ: 項目 const itemId = item.id; // 型: string</pre> <p>型付き配列内の要素にアクセスすると常に <code>unknown</code> が返される可能性があることを考慮すると、<code>item</code> は <code>item: item | unknown</code> である必要があります。 、これは null チェックを強制的に実行する必要がありますね。 </p> <p>さらに驚いたのは、次のコードも型チェックに合格したことです。</p> <pre class="brush:php;toolbar:false;">const item2: 項目 | 未定義 = list[3]; const item2Id = item2.id;</pre> <p>戻り値をキャストすると型チェックが失敗します: </p> <pre class="brush:php;toolbar:false;">const item3 = list[3] as 項目 | 未定義; const item3Id = item3.id; // [ts] オブジェクトは「未定義」である可能性があります。</pre> <p>明示的に型指定されたアクセサ関数を作成すると、<code>未定義</code> の状況もキャプチャできますが、不必要なオーバーヘッドが追加されます。 <pre class="brush:php;toolbar:false;">const getItem1 = (インデックス:番号, アイテム:アイテム[]):アイテム | 未定義 =>アイテム[インデックス]; const item3 = getItem1(3, list); const item3Id = item3 && item3.id;</pre> <p>これは Typescript の既知の制限ですか?この状況に対処するための推奨されるパターンまたはライブラリはありますか? </p>
P粉824889650P粉824889650468日前660

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

  • P粉194541072

    P粉1945410722023-08-25 11:31:36

    これは意図的な動作です。 TypeScript GitHub リポジトリでこの問題に関する長い議論をご覧ください

    strictNullChecks がオフになっています。オンにしてみてください。

    返事
    0
  • P粉330232096

    P粉3302320962023-08-25 11:19:47

    TS 4.1 アップデート:

    TypeScript 4.1 では、このケースの未定義を考慮して、microsoft/TypeScript#13778 での提案を実装する --noUncheckedIndexedAccess コンパイラ フラグが導入されました。この機能は、--strict コンパイル オプション セットの一部として有効化されておらず、プログラマが # に関する警告を望まない、または予期しない状況を生成するため、「厳密なインデックス シグネチャ」と呼ばれます。 ##未定義###。

    TS4.1 前の回答:

    インデックス署名では、オプションのプロパティとは異なり、要素タイプに

    | unknown

    が追加されないことがわかりました。これを実現するコンパイラ オプションを作成するという提案は、microsoft/TypeScript#13778 で行われました。その提案のコメントを読むと、他の質問にリンクしていますが、エラー率が高いためほとんど役に立たないというのがコンセンサスです。 は、要素タイプに

    | unknown

    を手動で追加できることにも言及しました: リーリー これは、言語全体に影響を与えることなく、期待どおりに機能します。

    返事
    0
  • キャンセル返事