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.
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();
É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();
Bien sûr, si vous voulez bien faire les choses, ce qui est parfois excessif, vous pouvez:
HTMLElement
HTMLElement
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ù
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
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.
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
.
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;
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
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.
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.
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).