2015-12-01 16 views
6

次のコードに問題があります。Typescript - TypeError myclass.myFunctionは関数ではありません

基本的に何をすべきか。与えられたJSONファイルをロードして解析する必要があります。また、RequestListenderにはIDHelloという文字列がToString()メソッドによって返され、Product.tsに表示されます。 tProduct.Idが正しく表示されている場合、tProduct.ToString()メソッドが失敗し、以下のエラーが表示されます。

ありがとうございます。

エラーメッセージ:

TypeError: tProduct.ToString is not a function. 
(In 'tProduct.ToString()', 'tProduct.ToString' is undefined) 

ファイル: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'); 
    } 

} 

ファイルProduct.ts

module pvis { 
    export class Product { 

     Id: string; 

     ToString():string { 
      return 'Hello'; 
     } 
    } 
} 

HTML部分:

<body onload="runTest('assets/products/json/A379N.json')"> 

コンパイル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'); 
    } 
} 

tsconfig.json(私はそれが関連しているのかはわからない):

{ 
    "compilerOptions": { 
     "target": "ES5", 
     "removeComments": true, 
     "preserveConstEnums": true, 
     "out": "js/main.js", 
     "sourceMap": true 
    }, 
    "files": [ 
     "src/Test.ts" 
    ] 
} 

答えて

8

ライン:

var tProduct : pvis.Product = JSON.parse(this.responseText); 

が間違っています。コンパイルする理由は、JSON.parseanyを返すためだけです。

クラスProductを使用するには、何らかの形でインスタンスを作成する必要があります。 JSONの解析ではこれが行われません。解析されたJSONを含むオブジェクトが戻されます。pvis.Productクラスのインスタンスにはなりません。

あなたがしたいことがJSON結果をタイプするのであれば、それをインターフェースで行うことができます。フォーム上のJSONオブジェクトがある場合例:

{ 
    id: "some value", 
    name: "some name", 
    count: 4 
} 

をあなたはインタフェースとそれを入力することができます。

interface myInterface { 
    id: string; 
    name: string; 
    count: number; 
} 

そしてそうのようにそれを使用します。

var myParsedAndTypedJson: myInterface = JSON.parse("...."); 

作成されたオブジェクトをそのようなものは決してメソッドを持たないでしょうが、その機能を望むなら、この情報をクラスに渡す必要があります。

class myClass implements myInterface { 

    get id(): string { return this.initData.id; } 
    get name(): string { return this.initData.name; } 
    get count(): number { return this.initData.count; } 

    constructor(private initData: myInterface) { 

    } 

    public ToString() { 
     return this.id + ' ' + this.name + ' ' + this.count; 
    } 
} 

hereの実例があります。

typescriptインターフェイスとJSONを操作する方法を調べて、これがどのように機能するかについてもう少し詳しく知りたいことがあります。

+0

インターフェイスのアプローチは私の最初のものでした。あなたが投稿したのとほとんど同じです。私はちょうどそれをより短く保つためにサンプルから削除しました。 – FrW

+0

申し訳ありません...私はかなり新しいです(Enterボタンを押してください)のでここでは完全な答えです: インターフェイスのアプローチは私の最初のテイクです。あなたが投稿したのとほとんど同じです。インターフェイスが問題の一部ではなかったため、サンプルから削除して、短くしておきました。 あなたと@ Dustin-Hodgesが言ったように、問題はJSON.parseにあり、それはインスタンスを作成しません。私はそれを推測していた。 **サポートをいただきありがとうございます**と私に正しい方向を教えてください。 – FrW

+0

問題はありませんが、私のコードでいくつかのエラーを修正するために私の答えを更新し、実行例を提供しました。助けてうれしい! – Nypan

1

私はTypeScriptに慣れていませんが、コンパイルされたJavaScriptを見ると、tProduct i Productクラスのインスタンスではなく、単にPOJOです。 tProduct instanceof Product === false)。

IDがエラーにならない理由は、JSON.parseがIdプロパティを持つオブジェクトを返すためです。

活字体型にデシリアライズする方法を参照するには、次のような答えを確認することができます。How do I initialize a typescript object with a JSON object

関連する問題