web-dev-qa-db-fra.com

Ignorer les erreurs TypeScript "La propriété n'existe pas sur la valeur de 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 tsc.exe?

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

179
daniel

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

Le problème réside dans l’absence de saisie TypeScript:

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

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


La méthode la plus simple consiste à taper explicitement variable sous la forme any

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

Edit, fin 2016

Étant donné que l'opérateur de diffusion préféré par TypeScript 1.6 est as, ces lignes peuvent être réparties de manière élégante:

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


Autres solutions

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

  1. Créez votre propre interface qui étend simplement HTMLElement
  2. Introduisez votre propre typage qui étend HTMLElement
239
michalczukm

La solution rapide et sale consiste à explicitement transtyper en any

(y as any).x

L'avantage est que, la distribution étant explicite, cela se compilera même avec le fanion noImplicitAny.

La solution appropriée 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 du type de cette variable.


Étant donné que je suis en mode disclaimer, la double diffusion via any associée à une nouvelle interface peut être utile dans les cas où

  • ne veux pas mettre à jour un fichier de dactylographie cassé
  • le singe patcher

pourtant, vous voulez toujours une certaine forme de frappe.

Supposons que vous souhaitiez patcher la définition d'une instance de y de type OrginalDef 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 = ....   //will compile
98
Bruno Grieder

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 à x sans avoir à nouveau une erreur TypeScript, vous devez l'écrire comme ceci y["x"], pas y.x. Donc, de ce point de vue, les autres options sont meilleures.

52
Yaroslav Yakovlev

Il y a 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 types, essayez ce qui suit:

declare var y;

Cela vous permettra de faire les appels que vous voulez sur var y.

37
Charles Marsh

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

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

let name: string = this.constructor.name;

Alors je l'ai corrigé avec:

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

Avait un problème dans Angular2, j'utilisais le stockage local pour enregistrer quelque chose et cela ne me le permettait pas.

Solutions:

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

Comment le réparer:

stockage local ['ville']

(stockage local) .city

(localStorage as any) .city

12
Avram Virgil

Une solution rapide où rien 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 une solution sans avoir à désactiver le littéral sans chaîne.

3
danday74

J'ai réussi à dépasser cela dans TypeScript 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 le seul moyen que je pouvais utiliser les valeurs à l'intérieur de X comme clés pour la carte Y et compiler.

0
cs_pupil

Dans mon projet particulier, je ne pouvais pas le faire fonctionner et utilisais 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 avoir utilisé cela (et je devais le faire pour que mes constructions automatiques réussissent).

0
Randy