Ignora errori di dattiloscritto "la proprietà non esiste sul valore di tipo"


228

In VS2013 la costruzione si arresta quando tsc esce con il codice 1. Questo non era il caso di VS2012.

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

Ricevo molti The property 'x' does not exist on value of type 'y'errori, che voglio ignorare quando utilizzo le funzioni javascript.

Risposte:


304

So che la domanda è già chiusa ma l'ho trovata cercando la stessa TypeScriptException, forse qualcun altro ha risposto a questa domanda cercando questo problema.

Il problema sta nella mancanza della digitazione TypeScript:

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

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


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

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

Modifica, fine 2016

Poiché l'operatore di fusione preferito di TypeScript 1.6 è che asle linee possono essere suddivise in eleganti:

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


Altre soluzioni

Ovviamente se vuoi farlo nel modo giusto, il che a volte è eccessivo, puoi:

  1. Crea la tua interfaccia che si estende semplicemente HTMLElement
  2. Introdurre la propria digitazione che si estende HTMLElement

14
È inoltre possibile creare un'interfaccia che si estende HTMLElemente ha la getBBoxproprietà aggiuntiva . In questo modo si ottiene comunque il completamento del codice sulle altre proprietà.
settimane

invece di lanciare in a getBBoxc'è un metodo per lanciare in modo appropriato? ti piace scoprire il tipo di getBBox?
Pardeep Jain,

FE: Se getBBoxfosse del HTMLElementtipo, puoi lanciare l'oggetto su di esso var typedElement = <HTMLElement> outerHtmlElement;.
michalczukm,

4
simpatico! var coordinates = (<any>outerElement[0]).getBBox();
bowpunya,

1
Questo in realtà non risponde alla domanda: "Come IGNORARE gli errori"
Petr Peller,

123

La soluzione rapida e sporca è quella di eseguire il cast esplicito any

(y as any).x

Il "vantaggio" è che, essendo il cast esplicito, questo verrà compilato anche con il noImplicitAnyset di flag.

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

Si noti che, quando si esegue il cast di una variabile any, si annulla la verifica del tipo per quella variabile.


Dal momento che sono in modalità disclaimer, il doppio casting tramite anycombinato con una nuova interfaccia, può essere utile nelle situazioni in cui tu

  • non voglio aggiornare un file di tipizzazioni rotto
  • sono patch di scimmie

tuttavia, vuoi ancora qualche forma di digitazione.

Supponi di voler applicare una patch alla definizione di un'istanza ydi tipo OrginalDefcon una nuova proprietà xdi tipo number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile

grazie aiutato: import http = request ('http'); server var = http come qualsiasi; server.Server (app); // ignora gli errori ts!
scape

L'ho usato in "Assicurati che la proprietà non sia stata trovata su NodeRequire". così ho dichiarato la mia variabile request su NodeRequired e (request as any) .ensure per la proprietà. Spero che questo ti aiuti.
Juni Brosas,

61

Puoi anche usare il seguente trucco:

y.x = "some custom property"//gives typescript error

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

Si noti che per accedere xe non ottenere nuovamente un errore di dattiloscritto è necessario scriverlo in questo modo y["x"], non y.x. Quindi, da questo punto di vista, le altre opzioni sono migliori.


4
Qualcuno sa perché questo funziona e se ciò ha potenziali conseguenze o benefici rispetto alla dichiarazione iniziale dell'oggetto :any?
Sì,

Avrebbe il chiaro vantaggio di mantenere la digitazione, piuttosto che lanciarla su qualsiasi. Vorrei sapere perché questo non genera un avvertimento, ma l'accesso diretto lo fa ...
Powderham,

38

Esistono diversi modi per gestire questo problema. Se questo oggetto è correlato a qualche libreria esterna, la soluzione migliore sarebbe quella di trovare il file delle definizioni effettive (ottimo repository qui ) per quella libreria e fare riferimento ad esso, ad esempio:

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

Naturalmente, questo non si applica in molti casi.

Se si desidera "sovrascrivere" il sistema dei tipi, provare quanto segue:

declare var y;

Ciò ti consentirà di effettuare qualsiasi chiamata var y.


5
Dovrebbe essere /// <reference path="/path/to/jquery.d.ts" />con il tag di chiusura automatica al termine
tic

Sto usando VS2015 e ho seguito questo tutorial per angolare, non ho jquery.d.tsfile nel mio progetto
Dimple

@Dimple npm install -g tsdthentsd install jquery
Akash

La seconda opzione (dichiarare var y) funziona alla grande se si sta migrando da JavaScript a TypeScript e si desidera avere l'errore TS2304 perché il vecchio JavaScript fa riferimento a una variabile in un altro file JavaScript.
Sì,

Grazie! Per me il problema era con Jest, const mockPrompt: any = jest.spyOn (step, 'prompt');
Mark Robson,

18

Quando TypeScript pensa che la proprietà "x" non esiste su "y" , puoi sempre eseguire il cast di "y" in "any", che ti permetterà di chiamare qualsiasi cosa (come "x") su "y".

Teoria

(<any>y).x;

Esempio del mondo reale

Stavo ottenendo l'errore "TS2339: la proprietà 'nome' non esiste sul tipo 'Funzione'" per questo codice:

let name: string = this.constructor.name;

Quindi l'ho risolto con:

let name: string = (<any>this).constructor.name;

1
Non funziona con Super. Se estendi una classe usando le digitazioni e l'autore dimentica un metodo pubblico, sei praticamente fregato. Devi aggiungerlo alla definizione del tipo, che si interrompe alla successiva installazione di npm, costringendoti a creare una richiesta pull o a informare in altro modo l'autore, che è probabilmente una buona cosa ma una seccatura.
Corey Alix,

15

Ho avuto un problema in Angular2, stavo usando l'archiviazione locale per salvare qualcosa e non me lo avrebbe permesso.

soluzioni:

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

Come sistemarlo:

localStorage [ 'città']

(LocalStorage) .city

(localStorage come qualsiasi) .city


La seconda opzione sembra interessante, ma sembra non fare più il lavoro. Funziona se si antepone un oggetto con<any> - (<any>localStorage).city.
jayarjo,

So che questo è vecchio ma il tuo esempio migliore ha funzionato per me .. Ben fatto.
MacD,

4

Una soluzione rapida in cui nient'altro funziona:

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

Non è una buona pratica, ma fornisce una soluzione senza la necessità di disattivare letterale senza stringhe


Faccio anche questo, ma alcune piattaforme (come Google Cloud) genereranno un messaggio di avviso che suggerisce che ab è migliore di una ['b']. Sai perché questo è?
Jonathan,

1
Non sono sicuro ma puoi, ad esempio, in tslint.json, cambiare le opzioni in modo che preferisca ab
danday74

3

So che è il 2020, ma non ho potuto vedere una risposta che soddisfacesse la parte "ignora" della domanda. A quanto pare, puoi dire a TSLint di fare proprio questo usando una direttiva;

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

Normalmente questo genererebbe un errore, affermando che 'someProp non esiste sul tipo'. Con il commento, quell'errore scompare.

Questo eviterà che vengano generati errori durante la compilazione e dovrebbe anche impedire al tuo IDE di lamentarti.


0

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


0

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

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);
}

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.