javascript - Typescript-Fehler ignorieren „Eigenschaft existiert nicht auf Wert vom Typ“
In VS2013 stoppt der Build, wenn tsc mit Code 1 beendet wird. Dies war in VS2012 nicht der Fall.
Wie kann ich meine Lösung ausführen, während ich den tsc.exe-Fehler ignoriere?
Ich bekomme viele Die Eigenschaft 'x' existiert nicht auf dem Wert vom Typ 'y' Fehler, die ich ignorieren möchte, wenn ich JavaScript-Funktionen verwende.
Antwort #1
Ich weiß, dass die Frage bereits geschlossen ist, aber ich habe sie beim Suchen nach demselben TypeScriptException gefunden, vielleicht ist jemand anderes auf diese Frage gestoßen, während er nach diesem Problem gesucht hat.
Das Problem liegt an fehlender TypeScript-Typisierung:
var coordinates = outerElement[0].getBBox();
Wirft Die Eigenschaft 'getBBox' existiert nicht für den Wert des Typs 'HTMLElement'.
var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();
Bearbeiten, Ende 2016
Seit TypeScript 1.6 ist der bevorzugte Typumwandlungsoperator as, daher können diese Zeilen zusammengefasst werden zu:
let coordinates = (outerElement[0] as any).getBBox();Andere Lösungen
Natürlich, wenn Sie es richtig machen möchten, was manchmal übertrieben ist, können Sie:
- Erstellen Sie eine eigene Schnittstelle, die einfach
HTMLElementerweitert - Eigenen Typ einführen, der
HTMLElementerweitert
Antwort #2
Die schnelle und einfache Lösung besteht darin, explizit auf any zu casten
(y as any).x
Der "Vorteil" besteht darin, dass der Cast explizit ist, wodurch dies auch bei gesetztem noImplicitAny-Flag kompiliert.
Die richtige Lösung besteht darin, die Typdefinitionsdatei zu aktualisieren.
Bitte beachten Sie, dass Sie beim Konvertieren einer Variablen in any die Typprüfung für diese Variable abwählen.
Da ich mich im Haftungsausschlussmodus befinde, kann ein doppeltes Casting über any in Kombination mit einem neuen Interface in Situationen nützlich sein, in denen
- Du willst eine kaputte Typisierungsdatei nicht aktualisieren
- und/oder du bekommst Affenflicken
Dennoch möchtest du immer noch eine gewisse Form des Tippens.
Angenommen, Sie möchten die Definition einer Instanz von y vom Typ OrginalDef mit einer neuen Eigenschaft x vom Typ number patchen:
// The `y` variable has a typing `OriginalDef` missing a property `x`
const y: OriginalDef = ...
// create an interface with your new property(ies)
interface DefWithNewProperties extends OriginalDef {
x: number
}
// patch the current `y` to the new interface using double casting
const patched = y as any as DefWithNewProperties
// the patched value can now access the new property
// the type inference and type checker will work correctly
patched.x = .... //will compile
Antwort #3
Sie können auch den folgenden Trick verwenden:
y.x = "some custom property"//gives typescript errory["x"] = "some custom property"//no errorsBeachte, dass man, um auf x zuzugreifen und keinen Typescript-Fehler mehr zu bekommen, es so schreiben muss: y["x"], nicht y.x. Aus dieser Perspektive sind also die anderen Optionen besser.
Antwort #4
Es gibt mehrere Möglichkeiten, dieses Problem zu lösen. Wenn dieses Objekt mit einer externen Bibliothek zusammenhängt, wäre die beste Lösung, die eigentliche Definitionsdatei (großartiges Repository hier) für diese Bibliothek zu finden und darauf zu verweisen, z. B.:
/// <reference path="/path/to/jquery.d.ts" >
Natürlich gilt dies in vielen Fällen nicht.
Wenn Sie das Typsystem 'überschreiben' möchten, versuchen Sie Folgendes:
declare var y;
Dies ermöglicht es Ihnen, beliebige Anrufe auf var y zu tätigen.
Antwort #5
Ich weiß, es ist jetzt 2020, aber ich konnte keine Antwort sehen, die den Teil „ignorieren“ der Frage zufriedenstellte. Es stellt sich heraus, dass man TSLint genau das mit einer Direktive sagen kann;
// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);
Normalerweise würde dies einen Fehler auslösen, der besagt, dass 'someProp auf diesem Typ nicht existiert'. Mit dem Kommentar verschwindet dieser Fehler.
Dies wird verhindern, dass beim Kompilieren Fehler auftreten, und sollte auch verhindern, dass Ihre IDE sich über Sie beschwert.
Antwort #6
Wenn TypeScript denkt, dass die Eigenschaft "x" auf "y" nicht existiert, dann können Sie "y" immer in "any" umwandeln, was es Ihnen erlaubt, alles (wie "x") auf "y" aufzurufen.
Theorie
(<any>y).x;
Echtes Weltbeispiel
Ich erhielt den Fehler „TS2339: Eigenschaft 'name' existiert nicht auf dem Typ 'Function'“ für diesen Code:
let name: string = this.constructor.name;
Also habe ich es mit folgendem behoben:
let name: string = (<any>this).constructor.name;
Antwort #7
Hatte ein Problem in Angular2, ich habe den lokalen Speicher verwendet, um etwas zu speichern, und es ließ mich nicht.
Lösungen:
Ich hatte localStorage.city -> Fehler -> Eigenschaft 'city' existiert nicht im Typ 'Storage'.
Wie man es repariert:
localStorage['city']
(localStorage).city
(localStorage als any).city
