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.

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

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

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.


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.


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;

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


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


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.


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.