Typoskriptfehler ignorieren "Eigenschaft existiert nicht für Wert des Typs"

227

In VS2013 wird die Erstellung gestoppt, wenn tsc mit Code 1 beendet wird. Dies war in VS2012 nicht der Fall.

Wie kann ich meine Lösung ausführen, während der Fehler tsc.exe ignoriert wird?

Ich erhalte viele The property 'x' does not exist on value of type 'y'Fehler, die ich bei der Verwendung von Javascript-Funktionen ignorieren möchte.

Daniel
quelle

Antworten:

302

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 asverwendet, 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:

  1. Erstellen Sie eine eigene Schnittstelle, die einfach erweitert wird HTMLElement
  2. Führen Sie eine eigene Eingabe ein, die sich erweitert HTMLElement
michalczukm
quelle
14
Sie können auch eine Schnittstelle erstellen, die erweitert wird HTMLElementund über die zusätzliche getBBoxEigenschaft verfügt. Auf diese Weise erhalten Sie weiterhin Code-Vervollständigung für die anderen Eigenschaften.
ganzen Wochen
getBBoxGibt es eine Methode, um richtig zu gießen, anstatt in irgendein zu werfen? Möchten Sie herausfinden, welche Art von getBBox?
Pardeep Jain
FE: Wenn getBBoxes sich um einen HTMLElementTyp handelt, können Sie das Objekt durch umwandeln var typedElement = <HTMLElement> outerHtmlElement;.
michalczukm
4
nett! var coordinates = (<any>outerElement[0]).getBBox();
Bowpunya
1
Dies beantwortet eigentlich nicht die Frage: "Wie man die Fehler ignoriert"
Petr Peller
120

Die schnelle und schmutzige Lösung besteht darin, explizit darauf zu setzen any

(y as any).x

Der "Vorteil" ist, dass die Besetzung, da sie explizit ist, auch mit noImplicitAnygesetztem 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 anyKombination mit einer neuen Schnittstelle in Situationen nützlich sein, in denen Sie

  • Ich möchte keine fehlerhafte Schreibdatei aktualisieren
  • sind Affen Patching

Dennoch möchten Sie immer noch eine Form der Eingabe.

Angenommen, Sie möchten die Definition einer Instanz yvom Typ OrginalDefmit einer neuen Eigenschaft xvom Typ patchen number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile
Bruno Grieder
quelle
danke das hat geholfen: import http = require ('http'); var server = http wie alle; server.Server (App); // ignoriert ts Fehler!
Scape
Ich habe dies in "Sicherstellen, dass die Eigenschaft nicht auf NodeRequire gefunden wurde" verwendet. Daher habe ich meine Anforderungsvariable in NodeRequired und (erforderlich wie alle) .ensure für die Eigenschaft deklariert. Hoffe das hilft.
Juni Brosas
61

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, xum auf einen Typoskriptfehler zuzugreifen und ihn nicht erneut zu erhalten, ihn so schreiben müssen y["x"], nicht y.x. Aus dieser Perspektive sind die anderen Optionen besser.

Jaroslaw Jakowlew
quelle
4
Weiß jemand, warum dies funktioniert und ob dies potenzielle Konsequenzen oder Vorteile gegenüber der anfänglichen Deklaration des Objekts hat :any?
Mcheah
Es hätte den klaren Vorteil, die Typisierungen beizubehalten, anstatt sie zu übertragen. Ich würde gerne wissen, warum dies keine Warnung auslöst, der direkte Zugriff jedoch.
Powderham
38

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.

/// <reference path="/path/to/jquery.d.ts" >

Dies gilt natürlich in vielen Fällen nicht.

Wenn Sie das Typsystem "überschreiben" möchten, versuchen Sie Folgendes:

declare var y;

Auf diese Weise können Sie alle gewünschten Anrufe tätigen var y.

Charles Marsh
quelle
5
Sollte /// <reference path="/path/to/jquery.d.ts" />mit dem selbstschließenden Tag am Ende
tic
Ich benutze VS2015 und habe dieses Tutorial für Angular befolgt. Ich habe keine jquery.d.tsDatei in meinem Projekt
Dimple
@Dimple npm install -g tsddanntsd install jquery
Akash
Die zweite Option (var y deklarieren) funktioniert hervorragend, wenn Sie von JavaScript nach TypeScript migrieren und den Fehler TS2304 vermeiden möchten, da Ihr altes JavaScript auf eine Variable in einer anderen JavaScript-Datei verweist.
Yesman
Vielen Dank! Für mich war das Problem mit Jest, const mockPrompt: any = jest.spyOn (Schritt, 'Eingabeaufforderung');
Mark Robson
18

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

(<any>y).x;

Beispiel aus der realen Welt

Ich habe die Fehlermeldung "TS2339: Eigenschaft 'Name' existiert nicht für Typ 'Funktion'" für diesen Code erhalten:

let name: string = this.constructor.name;

Also habe ich es behoben mit:

let name: string = (<any>this).constructor.name;
Benny Neugebauer
quelle
1
Funktioniert nicht mit super. Wenn Sie eine Klasse mit Schreibweisen erweitern und der Autor eine öffentliche Methode vergisst, sind Sie ziemlich durcheinander. Sie müssen es der Typdefinition hinzufügen, die bei der nächsten npm-Installation gestoppt wird, sodass Sie eine Pull-Anforderung erstellen oder den Autor auf andere Weise benachrichtigen müssen. Dies ist wahrscheinlich eine gute Sache, aber ein Problem.
Corey Alix
15

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:

localStorage ['Stadt']

(localStorage) .city

(localStorage wie jedes) .city

Avram Virgil
quelle
Die zweite Option sieht cool aus, scheint aber den Job nicht mehr zu machen. Funktioniert, wenn Sie einem Objekt <any>- voranstellen (<any>localStorage).city.
Jayarjo
Ich weiß, dass dies alt ist, aber Ihr Top-Beispiel hat nur für mich funktioniert. Gut gemacht.
MacD
4

Eine schnelle Lösung, bei der nichts anderes funktioniert:

const a.b = 5 // error

const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled

const B = 'b'
const a[B] = 5 // always works

Keine gute Praxis, bietet jedoch eine Lösung, ohne dass das No-String-Literal deaktiviert werden muss

danday74
quelle
Ich mache das auch, aber einige Plattformen (wie Google Cloud) geben eine Warnmeldung aus, die darauf hinweist, dass ab besser ist als a ['b']. Weißt du warum das so ist?
Jonathan
1
Ich bin mir nicht sicher, aber Sie können beispielsweise in tslint.json die Optionen so ändern, dass sie ab
danday74
3

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.

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

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.

Lewis
quelle
0

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).

Geil
quelle
0

Ich konnte dies in Typoskript mit so etwas wie:

let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
    y.set(x[i], //value for this key here);
}

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.

cs_pupil
quelle