298 votes

Ignorer les erreurs Typescript "la propriété n'existe pas sur la valeur du type"

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

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

Je reçois de nombreuses erreurs La propriété 'x' n'existe pas sur la valeur de type 'y', que je souhaite ignorer lors de l'utilisation de fonctions JavaScript.

394voto

michasm Points 505

Je sais que la question est déjà closes, mais je l'ai trouvée en cherchant la même TypeScriptException, peut-être que quelqu'un d'autre tombera sur cette question en cherchant pour ce problème.

Le problème réside dans le manque de typage TypeScript :

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

Retourne La propriété 'getBBox' n'existe pas sur le type 'HTMLElement'.

La manière la plus simple est de typer explicitement la variable comme `any`

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

Édition, fin 2016

Depuis TypeScript 1.6, l'opérateur de conversion préféré est as, donc ces lignes peuvent être fusionnées en :

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


Autres solutions

Bien sûr, si vous voulez faire les choses correctement, ce qui est parfois excessif, vous pouvez :

  1. Créer votre propre interface qui étend simplement HTMLElement
  2. Introduire votre propre typage qui étend HTMLElement

184voto

BGR Points 4330

La solution rapide et peu élégante est de caster explicitement en any

(y as any).x

L'"avantage" est que, le cast étant explicite, cela compilera même avec le drapeau noImplicitAny activé.

La solution propre est de mettre à jour le fichier de définition des types.

Veuillez noter que, lorsque vous castez une variable en any, vous désactivez la vérification des types pour cette variable.


Puisque je suis en mode avertissement, le double cast via any combiné avec une nouvelle interface peut être utile dans les situations où

  • vous ne voulez pas mettre à jour un fichier de définition des types cassé
  • et/ou vous faites du monkey patching

mais que vous voulez quand même une forme de typage.

Disons que vous voulez modifier la définition d'une instance de y de type OriginalDef avec une nouvelle propriété x de type number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //compilera

82voto

Yaroslav Yakovlev Points 1634

Vous pouvez également utiliser le tour suivant:

y.x = "une propriété personnalisée"// donne une erreur TypeScript

y["x"] = "une propriété personnalisée"// pas d'erreurs

Notez que pour accéder à x et ne pas obtenir à nouveau une erreur TypeScript, vous devez l'écrire ainsi y["x"], non y.x. Donc de ce point de vue, les autres options sont meilleures.

42voto

Charles Marsh Points 864

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

/// 

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

Si vous voulez 'outrepasser' le système de types, essayez ce qui suit :

declare var y;

Cela vous permettra de faire n'importe quel appel que vous voulez sur var y.

26voto

Benny Neugebauer Points 5393

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

Théorie

(y).x;

Exemple du monde réel

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

let name: string = this.constructor.name;

Donc je l'ai corrigé avec :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X