Ich weiß, dass die Frage bereits geschlossen ist, aber ich habe festgestellt, dass sie nach derselben TypeScriptException sucht. Vielleicht hat jemand anderes diese Frage auf der Suche nach diesem Problem getroffen.
Das Problem liegt in der fehlenden TypeScript-Eingabe:
var coordinates = outerElement[0].getBBox();
Würfe The property 'getBBox' does not exist on value of type 'HTMLElement'.
Am einfachsten ist es, Variable explizit als einzugeben any
var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();
Bearbeiten, Ende 2016
Da TypeScript 1.6 den bevorzugten Casting-Operator as
verwendet, können diese Zeilen in elegante Elemente umgewandelt werden:
let coordinates = (outerElement[0] as any).getBBox();
Andere Lösungen
Wenn Sie es richtig machen möchten, was manchmal ein Overkill ist, können Sie natürlich:
- Erstellen Sie eine eigene Schnittstelle, die einfach erweitert wird
HTMLElement
- Führen Sie eine eigene Eingabe ein, die sich erweitert
HTMLElement
HTMLElement
und über die zusätzlichegetBBox
Eigenschaft verfügt. Auf diese Weise erhalten Sie weiterhin Code-Vervollständigung für die anderen Eigenschaften.getBBox
Gibt es eine Methode, um richtig zu gießen, anstatt in irgendein zu werfen? Möchten Sie herausfinden, welche Art vongetBBox
?getBBox
es sich um einenHTMLElement
Typ handelt, können Sie das Objekt durch umwandelnvar typedElement = <HTMLElement> outerHtmlElement;
.var coordinates = (<any>outerElement[0]).getBBox();
Die schnelle und schmutzige Lösung besteht darin, explizit darauf zu setzen
any
Der "Vorteil" ist, dass die Besetzung, da sie explizit ist, auch mit
noImplicitAny
gesetztem Flag kompiliert wird .Die richtige Lösung besteht darin, die Typisierungsdefinitionsdatei zu aktualisieren.
Bitte beachten Sie, dass, wenn Sie eine Variable zu werfen
any
, können Sie Opt - out für diese Variable der Typprüfung.Da ich mich im Haftungsausschlussmodus befinde, kann Double Casting in
any
Kombination mit einer neuen Schnittstelle in Situationen nützlich sein, in denen SieDennoch möchten Sie immer noch eine Form der Eingabe.
Angenommen, Sie möchten die Definition einer Instanz
y
vom TypOrginalDef
mit einer neuen Eigenschaftx
vom Typ patchennumber
:quelle
Sie können auch den folgenden Trick verwenden:
y.x = "some custom property"//gives typescript error
y["x"] = "some custom property"//no errors
Beachten Sie, dass Sie,
x
um auf einen Typoskriptfehler zuzugreifen und ihn nicht erneut zu erhalten, ihn so schreiben müsseny["x"]
, nichty.x
. Aus dieser Perspektive sind die anderen Optionen besser.quelle
:any
?Es gibt verschiedene Möglichkeiten, um dieses Problem zu lösen. Wenn dieses Objekt mit einer externen Bibliothek verknüpft ist, besteht die beste Lösung darin, die eigentliche Definitionsdatei (großes Repository hier ) für diese Bibliothek zu finden und darauf zu verweisen, z.
Dies gilt natürlich in vielen Fällen nicht.
Wenn Sie das Typsystem "überschreiben" möchten, versuchen Sie Folgendes:
Auf diese Weise können Sie alle gewünschten Anrufe tätigen
var y
.quelle
/// <reference path="/path/to/jquery.d.ts" />
mit dem selbstschließenden Tag am Endejquery.d.ts
Datei in meinem Projektnpm install -g tsd
danntsd install jquery
Wenn TypeScript der Meinung ist, dass die Eigenschaft "x" für "y" nicht vorhanden ist , können Sie "y" immer in "any" umwandeln, sodass Sie alles (wie "x") für "y" aufrufen können.
Theorie
Beispiel aus der realen Welt
Ich habe die Fehlermeldung "TS2339: Eigenschaft 'Name' existiert nicht für Typ 'Funktion'" für diesen Code erhalten:
Also habe ich es behoben mit:
quelle
Hatte ein Problem in Angular2, ich benutzte den lokalen Speicher, um etwas zu speichern, und es ließ mich nicht.
Lösungen:
ich hatte
localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.
Wie man es repariert:
quelle
<any>
- voranstellen(<any>localStorage).city
.Eine schnelle Lösung, bei der nichts anderes funktioniert:
Keine gute Praxis, bietet jedoch eine Lösung, ohne dass das No-String-Literal deaktiviert werden muss
quelle
Ich weiß, dass es jetzt 2020 ist, aber ich konnte keine Antwort sehen, die den "Ignorieren" -Teil der Frage befriedigte. Es stellt sich heraus, dass Sie TSLint mithilfe einer Direktive anweisen können, genau das zu tun.
Normalerweise würde dies einen Fehler auslösen, der besagt, dass "someProp für Typ nicht vorhanden ist". Mit dem Kommentar verschwindet dieser Fehler.
Dies verhindert, dass beim Kompilieren Fehler auftreten, und sollte auch verhindern, dass sich Ihre IDE bei Ihnen beschwert.
quelle
In meinem speziellen Projekt konnte ich es nicht zum Laufen bringen und benutzte es
declare var $;
. Keine saubere / empfohlene Lösung, sie erkennt die JQuery-Variablen nicht, aber ich hatte nach der Verwendung keine Fehler (und musste, damit meine automatischen Builds erfolgreich waren).quelle
Ich konnte dies in Typoskript mit so etwas wie:
Dies schien die einzige Möglichkeit zu sein, die Werte in X als Schlüssel für die Karte Y zu verwenden und zu kompilieren.
quelle