ホームページ > 記事 > ウェブフロントエンド > ここでは、いくつかのタイトルのオプションを質問形式で示します。 タイプセーフティに焦点を当てる: * TypeScript が Array.prototype.includes() の型引数を制限するのはなぜですか? * Array.prototype.includes() の使用方法
Type System と Array.prototype.includes()
TypeScript は型安全性を強制するため、Array などの関数を使用するときにエラーが発生する可能性があります。プロトタイプ.includes()。この関数は、searchElement 引数が配列要素と同じ型であることを期待します。ただし、特定のシナリオでは、入力が異なる型を持つ可能性があり、型引数がなぜ制約されるのかという疑問が生じます。
TypeScript ライブラリは、searchElement パラメーターが配列要素と一致するように厳密に型指定されることを前提としています。この仮定はほとんどの場合に当てはまりますが、スーパータイプを扱う場合には問題が生じる可能性があります。このような場合、スーパータイプを許可するために標準の TypeScript 宣言をオーバーライドする必要がある場合があります。
Array.prototype.includes() のオーバーライド
1 つの方法は、ローカルでオーバーライドすることです。宣言のマージによる標準ライブラリ宣言。 TypeScript にはスーパータイプの制約がないため、それらをエミュレートするために条件付きタイプが使用されます:
<code class="typescript">declare global { interface Array<T> { includes<U extends (T extends U ? unknown : never)>( searchElement: U, fromIndex?: number ): boolean; } }</code>
この宣言を使用すると、元のコードはエラーなしで動作します:
<code class="typescript">if (exampleArr.includes(e.key)) {} // okay</code>
配列型の拡張
より簡単な解決策は、exampleArr の型を読み取り専用 string[] に拡張することです。
<code class="typescript">const stringArr: readonly string[] = exampleArr; // no assertion if (stringArr.includes(e.key)) {} // okay</code>
読み取り専用 string[] に拡張すると、入力を妥協することなく別の型を持つことができます。タイプセーフティ。対照的に、string[] への拡張は、TypeScript による配列共分散の不適切な処理により、安全でない可能性があります。
以上がここでは、いくつかのタイトルのオプションを質問形式で示します。 タイプセーフティに焦点を当てる: * TypeScript が Array.prototype.includes() の型引数を制限するのはなぜですか? * Array.prototype.includes() の使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。