Ignorer les erreurs de frappe «la propriété n'existe pas sur la valeur du type»

228

Dans VS2013, la construction s'arrête lorsque tsc se termine avec le code 1. Ce n'était pas le cas dans VS2012.

Comment puis-je exécuter ma solution tout en ignorant l'erreur tsc.exe?

Je reçois de nombreuses The property 'x' does not exist on value of type 'y'erreurs, que je veux ignorer lors de l'utilisation des fonctions javascript.

daniel
la source

Réponses:

304

Je sais que la question est déjà fermée, mais je l'ai trouvée à la recherche de la même exception TypeScriptException, peut-être que quelqu'un d'autre a rencontré cette question à la recherche de ce problème.

Le problème réside dans la saisie TypeScript manquante:

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

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


Le moyen le plus simple consiste à taper explicitement la variable comme any

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

Edit, fin 2016

Étant donné que l'opérateur de asconversion préféré de TypeScript 1.6 est que ces lignes peuvent être transformées en élégantes:

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


Autres solutions

Bien sûr, si vous souhaitez le faire correctement, ce qui est parfois exagéré, vous pouvez:

  1. Créez votre propre interface qui étend simplement HTMLElement
  2. Introduire sa propre frappe qui étend HTMLElement
michalczukm
la source
14
Vous pouvez également créer une interface qui s'étend HTMLElementet possède la getBBoxpropriété supplémentaire . De cette façon, vous obtenez toujours l'achèvement du code sur les autres propriétés.
thetallweeks
au lieu de lancer dans n'importe quel, getBBoxexiste-t-il une méthode pour lancer correctement? vous voulez savoir le type de getBBox?
Pardeep Jain
FE: Si vous getBBoxseriez de HTMLElementtype, vous pourriez y couler l'objet var typedElement = <HTMLElement> outerHtmlElement;.
michalczukm
4
agréable! var coordinates = (<any>outerElement[0]).getBBox();
bowpunya
1
En fait, cela ne répond pas à la question: "Comment ignorer les erreurs"
Petr Peller
123

La solution rapide et sale consiste à convertir explicitement en any

(y as any).x

L '«avantage» est que, la distribution étant explicite, cela se compilera même avec le noImplicitAnydrapeau défini.

La bonne solution consiste à mettre à jour le fichier de définition des typages.

Veuillez noter que lorsque vous convertissez une variable en any, vous désactivez la vérification de type pour cette variable.


Étant donné que je suis en mode de non-responsabilité, la double diffusion via anycombinée à une nouvelle interface peut être utile dans les situations où vous

  • je ne veux pas mettre à jour un fichier de dactylographie cassé
  • sont des patchs de singe

pourtant, vous voulez toujours une forme de frappe.

Supposons que vous souhaitiez corriger la définition d'une instance yde type OrginalDefavec une nouvelle propriété xde type number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile
Bruno Grieder
la source
merci cela a aidé: importer http = require ('http'); var server = http comme tout; server.Server (app); // ignore les erreurs ts!
scape
J'ai utilisé ceci dans "s'assurer que la propriété n'est pas trouvée sur NodeRequire". j'ai donc déclaré ma variable require sur NodeRequired et (require as any) .ensure pour la propriété. J'espère que cela t'aides.
Juni Brosas
61

Vous pouvez également utiliser l'astuce suivante:

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

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

Notez que pour accéder xet ne pas obtenir à nouveau une erreur de frappe, vous devez l'écrire comme ça y["x"], non y.x. Dans cette perspective, les autres options sont donc meilleures.

Yaroslav Yakovlev
la source
4
Quelqu'un sait-il pourquoi cela fonctionne et si cela a des ramifications ou des avantages potentiels par rapport à la déclaration initiale de l'objet :any?
mcheah
Il aurait clairement l'avantage de conserver les dactylographes, plutôt que de les transtyper. Je voudrais savoir pourquoi cela ne déclenche pas d'avertissement, mais l'accès direct le fait ..
Powderham
38

Il existe plusieurs façons de gérer ce problème. Si cet objet est lié à une bibliothèque externe, la meilleure solution serait de trouver le fichier de définitions réel (grand référentiel ici ) pour cette bibliothèque et de le référencer, par exemple:

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

Bien sûr, cela ne s'applique pas dans de nombreux cas.

Si vous souhaitez "remplacer" le système de saisie, essayez ce qui suit:

declare var y;

Cela vous permettra de faire tous les appels que vous souhaitez var y.

Charles Marsh
la source
5
Devrait être /// <reference path="/path/to/jquery.d.ts" />avec la balise de fermeture automatique à la fin
tic
J'utilise VS2015 et j'ai suivi ce tutoriel pour angulaire je n'ai pas de jquery.d.tsfichier dans mon projet
Dimple
@Dimple npm install -g tsdalorstsd install jquery
Akash
La deuxième option (déclarer var y) fonctionne très bien si vous migrez de JavaScript vers TypeScript et que vous voulez éviter l'erreur TS2304 car votre ancien JavaScript fait référence à une variable dans un autre fichier JavaScript.
yesman
Merci! Pour moi, le problème était avec Jest, const mockPrompt: any = jest.spyOn (step, 'prompt');
Mark Robson
18

Lorsque TypeScript pense que la propriété "x" n'existe pas sur "y" , vous pouvez toujours convertir "y" en "any", ce qui vous permettra d'appeler n'importe quoi (comme "x") sur "y".

Théorie

(<any>y).x;

Exemple du monde réel

J'obtenais l'erreur "TS2339: La propriété 'nom' n'existe pas sur le type 'Fonction'" pour ce code:

let name: string = this.constructor.name;

Je l'ai donc corrigé avec:

let name: string = (<any>this).constructor.name;
Benny Neugebauer
la source
1
Ne fonctionne pas avec super. Si vous étendez une classe à l'aide de typages et que l'auteur oublie une méthode publique, vous êtes à peu près foutu. Vous devez l'ajouter à la définition de type, qui est arrêtée lors de la prochaine installation de npm, vous forçant à créer une demande d'extraction ou à en informer l'auteur, ce qui est probablement une bonne chose mais une douleur.
Corey Alix
15

J'ai eu un problème dans Angular2, j'utilisais le stockage local pour enregistrer quelque chose et il ne me le permettait pas.

Solutions:

j'ai eu localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

Comment le réparer:

localStorage ['ville']

(localStorage) .city

(localStorage comme tout) .city

Avram Virgil
la source
La deuxième option semble cool, mais ne semble plus faire le travail. Fonctionne si vous préfixez un objet avec <any>- (<any>localStorage).city.
jayarjo
Je sais que c'est vieux mais votre meilleur exemple a juste fonctionné pour moi .. Bravo.
MacD
4

Une solution rapide où rien d'autre ne fonctionne:

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

Ce n'est pas une bonne pratique mais fournit une solution sans avoir besoin de désactiver le littéral sans chaîne

danday74
la source
Je le fais aussi, mais certaines plates-formes (comme Google Cloud) lèveront un message d'avertissement suggérant que ab vaut mieux qu'un ['b']. Savez-vous pourquoi c'est?
Jonathan
1
Pas sûr mais vous pouvez, dans tslint.json par exemple, changer les options pour qu'il préfère ab
danday74
3

Je sais que c'est maintenant 2020, mais je n'ai pas pu voir une réponse qui satisfasse la partie "ignorer" de la question. Il s'avère que vous pouvez dire à TSLint de faire exactement cela en utilisant une directive;

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

Normalement, cela générerait une erreur, indiquant que «someProp n'existe pas sur le type». Avec le commentaire, cette erreur disparaît.

Cela arrêtera toute erreur lors de la compilation et devrait également empêcher votre IDE de vous plaindre.

Lewis
la source
0

Dans mon projet particulier, je ne pouvais pas le faire fonctionner et utilisé declare var $;. Ce n'est pas une solution propre / recommandée, il ne reconnaît pas les variables JQuery, mais je n'ai eu aucune erreur après l'avoir utilisé (et j'ai dû pour que mes builds automatiques réussissent).

Excité
la source
0

J'ai pu surmonter cela en tapant à la machine en utilisant quelque chose comme:

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

Cela semblait être la seule façon dont je pouvais utiliser les valeurs à l'intérieur de X comme clés pour la carte Y et compiler.

cs_pupil
la source