Typsystem und Array.prototype.includes()
TypeScript erzwingt die Typsicherheit, was bei der Verwendung von Funktionen wie Array zu Fehlern führen kann. Prototyp.includes(). Diese Funktion erwartet, dass das searchElement-Argument denselben Typ wie die Array-Elemente hat. In bestimmten Szenarien kann die Eingabe jedoch einen anderen Typ haben, was die Frage aufwirft, warum das Typargument eingeschränkt ist.
Die TypeScript-Bibliothek geht davon aus, dass der Parameter „searchElement“ streng typisiert ist, um mit den Array-Elementen übereinzustimmen. Während diese Annahme in den meisten Fällen zutrifft, kann sie beim Umgang mit Supertypen problematisch sein. In solchen Fällen muss möglicherweise die Standard-TypeScript-Deklaration überschrieben werden, um Supertypen zuzulassen.
Array.prototype.includes() überschreiben
Ein Ansatz besteht darin, das lokal zu überschreiben Standardbibliotheksdeklaration durch Deklarationszusammenführung. TypeScript verfügt nicht über Supertyp-Einschränkungen, daher werden bedingte Typen verwendet, um diese zu emulieren:
<code class="typescript">declare global { interface Array<T> { includes<U extends (T extends U ? unknown : never)>( searchElement: U, fromIndex?: number ): boolean; } }</code>
Mit dieser Deklaration funktioniert der Originalcode ohne Fehler:
<code class="typescript">if (exampleArr.includes(e.key)) {} // okay</code>
Erweiternder Array-Typ
Eine einfachere Lösung besteht darin, den Typ von exampleArr auf schreibgeschützten String[] zu erweitern:
<code class="typescript">const stringArr: readonly string[] = exampleArr; // no assertion if (stringArr.includes(e.key)) {} // okay</code>
Durch die Erweiterung auf schreibgeschützten String[] kann die Eingabe ohne Kompromisse einen anderen Typ haben Typensicherheit. Im Gegensatz dazu ist die Erweiterung auf string[] möglicherweise unsicher, da TypeScript die Array-Kovarianz nicht sinnvoll behandelt.
Das obige ist der detaillierte Inhalt vonHier sind einige Titeloptionen, alle im Fragenformat: Fokus auf Typensicherheit: * Warum schränkt TypeScript die Typargumente von Array.prototype.includes() ein? * Wie kann ich Array.prototype.includes() verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!