Tapuscrit - TypeError myclass.myFunction n'est pas une fonction
Je suis confronté à un problème avec le code suivant.
Ce que fondamentalement, ça devrait le faire. Il doit charger et analyser un fichier JSON. Et dans le RequestListender elle doit montrer le ID
et la chaîne Hello
qui est retourné par la ToString()
méthode dans Produit.ts. Où la tProduct.Id
est affiche correctement, le tProduct.ToString()
méthode échoue avec le message d'erreur indiqué ci-dessous.
Merci beaucoup à l'avance.
Message d'erreur:
TypeError: tProduct.ToString is not a function.
(In 'tProduct.ToString()', 'tProduct.ToString' is undefined)
Fichier: Test.ts
var currentProduct = null as pvis.Product;
function runTest(path) {
var request = new XMLHttpRequest();
request.onload = loadRequestListener;
request.open("get", path, true);
request.send();
}
function loadRequestListener () {
var tProduct : pvis.Product = JSON.parse(this.responseText);
if (tProduct.Id) {
currentProduct = tProduct;
alert('loaded with Id: ' + tProduct.Id );
alert('loaded with Content: ' + tProduct.ToString() );
}
else {
alert('product failed to load');
}
}
Fichier Produit.ts
module pvis {
export class Product {
Id: string;
ToString():string {
return 'Hello';
}
}
}
La partie HTML:
<body onload="runTest('assets/products/json/A379N.json')">
L'compilé en Javascript:
var pvis;
(function (pvis) {
var Product = (function () {
function Product() {
}
Product.prototype.ToString = function () {
return 'Hello';
};
return Product;
})();
pvis.Product = Product;
})(pvis || (pvis = {}));
var currentProduct = null;
function runTest(path) {
var request = new XMLHttpRequest();
request.onload = loadRequestListener;
request.open("get", path, true);
request.send();
}
function loadRequestListener() {
var tProduct = JSON.parse(this.responseText);
if (tProduct.Id) {
currentProduct = tProduct;
alert('loaded with Id: ' + tProduct.Id);
alert('loaded with Content: ' + tProduct.ToString());
}
else {
alert('product failed to load');
}
}
Le tsconfig.json (je ne sais pas si c'est pertinent):
{
"compilerOptions": {
"target": "ES5",
"removeComments": true,
"preserveConstEnums": true,
"out": "js/main.js",
"sourceMap": true
},
"files": [
"src/Test.ts"
]
}
Vous devez vous connecter pour publier un commentaire.
La ligne:
est faux. La raison pour laquelle il compile est dû uniquement à la
JSON.parse
retourany
.utiliser la classe
Product
vous devez créer une instance d'elle en quelque sorte. JSON analyser vais pas faire cela, il suffit de retourner un objet avec l'analyse JSON en elle, elle ne va pas être une instance de lapvis.Product
classe.Si ce que vous voulez faire est de taper le résultat JSON, vous pouvez le faire avec une interface. Par exemple, si vous avez un objet JSON sur la forme:
Vous pouvez taper avec l'interface:
Et de l'utiliser comme ceci:
Un objet créé qui n'auront jamais de méthodes toutefois, si vous souhaitez que les fonctionnalités que vous avez à transmettre cette information à une classe qui peut l'utiliser d'une manière que, par exemple;
De travail exemple de ceci peut être trouvé ici.
Vous voudrez peut-être regarder comment travailler avec la machine interfaces et JSON pour en apprendre un peu plus sur la façon dont cela fonctionne.
var myParsedAndTypedJson: myInterface = JSON.parse("....");
devrait être (alors qu'il fonctionne assez bien):var myParsedAndTypedJson: myInterface = new myClass(JSON.parse("...."));
Je ne suis pas familier avec la Machine, mais en regardant le compilé en JavaScript, j'ai remarqué que tProduct est juste un POJO, pas une instance de la classe de Produit (c'est à dire
tProduct instanceof Product === false
).L'identification de raison de ne pas erreur parce que JSON.analyser retourne un objet avec un Id de propriété.
Pour voir comment désérialiser à un Tapuscrit de type, vous pouvez vérifier la réponse suivante: Comment initialiser un tapuscrit de l'objet avec un objet JSON