Ignora errori di typescript “la proprietà non esiste sul valore di tipo”

In VS2013 l’edificio si ferma quando tsc esce con il codice 1. Questo non era il caso in VS2012.

Come posso eseguire la mia soluzione ignorando l’errore tsc.exe?

Ottengo molti The property 'x' does not exist on value of type 'y' errori che voglio ignorare quando si usano le funzioni javascript.

So che la domanda è già stata chiusa ma ho trovato la ricerca della stessa TypeScriptException, forse qualcun altro ha risposto a questa domanda alla ricerca di questo problema.

Il problema risiede nella tipizzazione TypeScript mancante:

 var coordinates = outerElement[0].getBBox(); 

The property 'getBBox' does not exist on value of type 'HTMLElement'.

Il modo più semplice è digitare esplicitamente una variabile come any

 var outerHtmlElement: any = outerElement[0]; var coordinates = outerHtmlElement.getBBox(); 

Modifica, a fine 2016

Dal momento che TypeScript 1.6 ha preferito l’operatore di casting è as quelle linee possono essere squqshed in eleganti:

let coordinates = (outerElement[0] as any).getBBox();


Altre soluzioni

Ovviamente se ti piacerebbe farlo nel modo giusto, che a volte è eccessivo, puoi:

  1. Crea una propria interfaccia che estenda semplicemente HTMLElement
  2. Introduci la digitazione che estende HTMLElement

La soluzione rapida e sporca consiste nel cast esplicito a any

 (y as any).x 

Il “vantaggio” è che, essendo il cast esplicito, questo verrà compilato anche con il flag noImplicitAny .

La soluzione corretta è aggiornare il file di definizione delle tipizzazioni.

Tieni presente che, quando lanci una variabile su any , decidi di non selezionare il tipo per quella variabile.


Dato che sono in modalità disclaimer, il doppio casting tramite any combinazione con una nuova interfaccia può essere utile in situazioni in cui tu

  • non voglio aggiornare un file di battitura rotto
  • sono patch di scimmia

ancora, vuoi ancora qualche forma di digitazione.

Supponi di voler applicare una patch alla definizione di un’istanza di y di tipo OrginalDef con una nuova proprietà x di tipo number :

 const y: OriginalDef = ... interface DefWithNewProperties extends OriginalDef { x: number } const patched = y as any as DefWithNewProperties patched.x = .... //will compile 

Puoi anche usare il seguente trucco:

yx = "some custom property"//gives typescript error

y["x"] = "some custom property"//no errors

Nota che per accedere a x e non ottenere di nuovo un errore di typescript, devi scriverlo in quel modo y["x"] , non yx . Quindi da questa prospettiva le altre opzioni sono migliori.

Esistono diversi modi per gestire questo problema. Se questo object è correlato ad alcune librerie esterne, la soluzione migliore sarebbe quella di trovare il vero file delle definizioni (grande repository qui ) per quella libreria e farvi riferimento, ad esempio:

 ///  

Naturalmente, questo non si applica in molti casi.

Se si desidera “sovrascrivere” il sistema di tipi, provare quanto segue:

 declare var y; 

Questo ti consentirà di effettuare tutte le chiamate che desideri su var y .

Quando TypeScript pensa che la proprietà “x” non esiste su “y” , puoi sempre lanciare “y” in “any”, che ti permetterà di chiamare qualsiasi cosa (come “x”) su “y”.

Teoria

 (y).x; 

Esempio di mondo reale

Stavo ricevendo l’errore “TS2339: nome proprietà” non esiste sul tipo “Funzione” “per questo codice:

 let name: string = this.constructor.name; 

Quindi l’ho risolto con:

 let name: string = (this).constructor.name; 

Ho avuto un problema in Angular2, stavo usando la memoria locale per salvare qualcosa e non me lo permetteva.

soluzioni:

Ho avuto localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

Come sistemarlo:

localStorage [ ‘città’]

(LocalStorage) .city

(localStorage come qualsiasi) .city

Una soluzione rapida in cui non funziona nient’altro:

 const ab = 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 

Non è una buona pratica, ma fornisce una soluzione senza dover distriggersre il letterale senza stringa

Nel mio particolare progetto non sono riuscito a farlo funzionare e ho usato declare var $; . Non è una soluzione pulita / consigliata, non riconosce le variabili di JQuery, ma non ho avuto errori dopo averlo usato (e ho dovuto fare in modo che le mie build automatiche avessero successo).

Sono stato in grado di superare questo in typescript usando qualcosa come:

 let x = [ //data inside array ]; let y = new Map(); for (var i=0; i 

Questo sembrava essere l'unico modo in cui potevo usare i valori all'interno di X come chiavi per la mappa Y e compilare.