配列要素が未定義を返す可能性を考慮していない Typescript コード
P粉824889650
2023-08-24 12:15:44
<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>
これは意図的な動作です。 TypeScript GitHub リポジトリでこの問題に関する長い議論をご覧ください
strictNullChecks
がオフになっています。オンにしてみてください。TS 4.1 アップデート:
TypeScript 4.1 では、
TS4.1 前の回答:このケースの未定義
を考慮して、microsoft/TypeScript#13778 での提案を実装する--noUncheckedIndexedAccess
コンパイラ フラグが導入されました。この機能は、--strict
コンパイル オプション セットの一部として有効化されておらず、プログラマが # に関する警告を望まない、または予期しない状況を生成するため、「厳密なインデックス シグネチャ」と呼ばれます。 ##未定義###。インデックス署名では、オプションのプロパティとは異なり、要素タイプに
| unknownが追加されないことがわかりました。これを実現するコンパイラ オプションを作成するという提案は、
| unknownmicrosoft/TypeScript#13778
で行われました。その提案のコメントを読むと、他の質問にリンクしていますが、エラー率が高いためほとんど役に立たないというのがコンセンサスです。 は、要素タイプにを手動で追加できることにも言及しました:
リーリー
これは、言語全体に影響を与えることなく、期待どおりに機能します。