2016-10-07 10 views
4

残念なことに、これを再現するためのコードは広範囲に及ぶため、簡単に私の問題を明らかにしたいと考えています。必要に応じて、より完全なソリューションを投稿します。Typescriptインターフェイスの日付は、実際には文字列です。

まず、私は、インターフェイスを定義しています:

export interface ITest { 
    myDate: Date; 
} 

それから私は、テストのためにこれらの配列を作成します。

export const TEST: ITest[]=[{myDate: new Date(1995, 8, 1)}] 

IからInMemoryDbServiceに当たっているAngular2でサービスを使用してこれらを公開angular2-in-memory-web-api。次のように私はこれを呼び出して、配列を取得するコードは次のとおりです。

get(): Promise<ITest[]>{ 
    return this.http.get(this.testUrl) 
     .toPromise() 
     .then(response => response.json().data as ITest[]) 
     .catch(this.handleError); 
} 

を...そして私は私のコンポーネントにそれを持って来る:

this.testService.get().then(tests => { 
     this.tests = tests; 
     console.log("Date Type:"+typeof(this.tests[0].myDate)); 
    }); 

このすべてが正常に動作しますが、問題がありますでそこに結果を示すconsole.log声明: - それはではありません、私の日付で開催された文字列が1995-09-01T07:00:00.000Zですが、主な問題であることを

Date Type:string 

その中のデータは、正しいですそれはstringです! VSコードでは、私はtoDateStringのようなメソッドのコード補完を取得しますが、それらを実行すると(もちろん)私はtoDateString is not a functionを取得します。

問題がresponse => response.json().data as ITest[]で発生しているのは間違いありませんが、なぜデータが実際にキャストされていないのですかDate?私は間違っている、私は理解しています。私は私のオブジェクトが私が期待するタイプを得ることができるように、これをどう扱うべきですか?

答えて

4

基本的にオブジェクトがそのインターフェイスに準拠していることをTypeScriptに伝えるには、type assertionというインターフェイスを使用しています。

しかし、実際には、 "myDate"プロパティが文字列として表現されているjsonオブジェクトがあります。

タイプアサーションを使用しても、生成されたJavaScriptコードには何らかの形で影響がありません。実際のタイプ変換は自分で行う必要があります。

文字列として使用される理由は、Dateを表すためにJSON形式で定義された型がないため、サーバーはdate.toString()の結果を送信しているに過ぎません。

あなたは戻り値を表すためのクラスを持っているので、のようなJSONのプロパティからオブジェクトをインスタンス化するだろうための一つのオプション:

var response = JSON.parse(JSON.stringify({ myDate: new Date() })); 

class Test { 
    constructor(json: { myDate: string }) { 

     this.myDate = new Date(json.myDate); 
    } 

    myDate: Date; 
} 

let test = new Test(response); 
console.log("Type: " + typeof (test.myDate)); 
console.log("Value: " + test.myDate); 
+2

そして、それはそれを呼び出して、ドキュメントの 'cast'と呼ばれるイベントではありません[type assertion](https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions)、それは何らかの形で生成されたjavascriptコードには影響しません。実際の型変換を自分で行う必要があります。そして、それが文字列として来る理由は、Dateを表すためにJSON形式で定義された型がないため、サーバはdate.toString()の結果を送信するだけです。 – artem

+0

ありがとう、正しい言葉ではないので、私の答えからキャストを削除しました。あなたのコメントは実際よりはるかに役立ちます。 –

+1

答えでそれを再利用してもかまいません:-) – artem

関連する問題