2016-04-29 20 views
1

が含まれていませ入力するリテラルJSONからキャストありません私はJSOをキャストするとき、私は同じ結果を得るは、なぜ私はこのようなモデルクラスを持つ関数

TypeError: task.completeTask() is not a function

:タスクのcompleteTask機能は、私は、エラーメッセージが表示されますNリテラルオブジェクトをタスクに追加します。

let task: Task = <Task>{ name: "Make some coffee" } 
task.completeTask(); // Results in error 

私は何か間違っていますか?機能が含まれていることを確認するにはどうすればよいですか?

+1

問題は、これが型_cast_ではないということですが、 _assertion_とタイプします。これは、型変換の実行時サポートを意味しません。 'task'は' Task'型のものだとコンパイラに伝えていますが、実際は 'json'から解析された' Object'型のものです。 JSONのこの問題は、TypeScriptの多少の共通の問題です。実際にはデコレータを使用してソリューションに取り組んでいます(もっと_testing_と似ています)。 –

答えて

2

実際にキャストすると、キャストしたタイプのインスタンスが実際にはありません。タスクのインスタンスではなく、リテラル形式のオブジェクトのみを宣言します。

それだけでキャストオブジェクトがタイプの構造に従っていることを確認するために活字が提供する方法です場合。しかし、それは設計時/コンパイル時にのみ実行時に何かではありません。

あなたが内容に基づいて、新しいオブジェクトをインスタンス化する必要があるタイプのメソッドを使用することができるようにしたい場合:

  • angular2 map data as specific object type
  • public getTask(): Observable<Task> { 
        return this._http 
         .get("url") 
         .map(res => { 
          let content = res.json().data; 
          let task = new Task(); 
          task.name = content.name; 
          task.status = content.status; 
          return task; 
         }); 
    } 
    

    詳細については、この質問を参照してください。

編集

あなたは、このようなTaskクラス宣言し、@のssubeのコメントを以下に示します。インスタンス化が容易になるだろう。この方法で

export class Task { 
    (...) 

    constructor(obj:{name:string, status:string}) { 
    this.name = obj.name; 
    this.status = obj.status; 
    } 

    (...) 
} 

を:

public getTask(): Observable<Task> { 
    return this._http 
     .get("url") 
     .map(res => new Task(res.json().data)); 
} 
+0

ああ、わかりました。もっと簡単な解決策があることを期待していました。 – Aetherix

+0

実際にはありません。 –

+1

@ThierryTemplierあなたの 'Task'クラスに'コンストラクタ(name、status) 'があれば簡単です。 – ssube

関連する問題