Angular4 HttpClientTypeCheckの問題

ラファエルレイエス

新しいAngularのHttpClientがTypeCheckingを実行できることを読みました。これに基づいて、次のコードを記述します。

post(path: string, body: Object = {}): Observable<ValorTest> {
return this.http.post<ValorTest>(path, JSON.stringify(body))
  .map((data: ValorTest) => {
    console.log(typeof data); // Why console displays 'data' as object instead of ValorTest?
    console.log(data instanceof ValorTest); // outputs: false
    console.log(data); // outputs (no type displayed in Chrome's console): {codigo: "INF00001", estado: "Success"}
  })
  .pipe(catchError(this.formatErrors));

}

モデルクラス(ValorTest)と一致するJSONを受信して​​います。

質問:console.logがValorTestではなくオブジェクトとしてデータのタイプを表示するのはなぜですか?

クリス・イェーガー

タイプチェック/アサーションを実行しているだけの場合は、instanceofを使用できます。実際にクラスの名前を出力する必要がある場合は、data.constructor.nameを試すことができます。

class TestClass {}

var instance  = new TestClass();

console.log(typeof instance);
// Expected output: "object"

console.log(instance.constructor.name);
// Expected output: "TestClass"

if (instance instanceof TestClass) {
    console.log("instance is TestClass");
}
// Expected output: "instance is TestClass"

理由について:typeofは、文字列、ブール値、オブジェクトなど、JavaScriptの組み込みデータ型でのみ機能します。TypeScriptがJavaScriptに変換される方法見ると、実行時にJavaScriptがインスタンスのみを認識している理由を理解できます。 「オブジェクト」です。

更新しました

これは、新しいclass()コンストラクターで作成されたインスタンスでのみ機能します。HttpClientは、実際にはここでクラスのインスタンスを作成していません。基本的には、(開発目的で)応答で受け取ると予想されるデータの種類をTypeScriptで指定できるようにするだけです私の知る限り、HttpClientは、応答データが実際にそれらの期待を満たしていることを(実行時に)保証するために何もしません実行時に強力な型チェックが必要な場合は、おそらく独自の型ガード関数を作成する必要があります。

したがって、このようなクラスがある場合:

class TestClass {
    prop: string;
    constructor() { }
    method(): void {}
}

次のようなタイプガードを作成できます。

function isTestClass(obj: TestClass | object): obj is TestClass {
    // add whatever type checking logic you need here
    return (<TestClass>obj).method !== undefined && 
           (<TestClass>obj).prop !== undefined; 
}

そして、実行時にデータを確認します。

var obj_a = { prop: "" },
    obj_b = { prop: "", method: null };

console.log(isTestClass(obj_a));
// Expected output: false

console.log(isTestClass(obj_b));
// Expected output: true

型ガード関数をクラスの静的メソッドにするかもしれません。

また、余談ですが、クラスの代わりに応答データにインターフェイスを使用することを検討することもできます。これは主に、受け取ったデータに期待する実装がある場合とない場合があるという直感を促進するのに役立つためです。

ユーザー定義のタイプガードの詳細については、https//www.typescriptlang.org/docs/handbook/advanced-types.htmlをご覧ください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ngIfのAngular4の問題

分類Dev

Angular4のDatepicker

分類Dev

Angular4 +のRaphael

分類Dev

Angular4 / TypescriptのAngular ForEach?

分類Dev

Angular4で同等の$ locationChangeStart

分類Dev

Angular4を使用する場合のngModuleの問題

分類Dev

Angular4での子ルーティングの問題

分類Dev

* ngForのangular4ローカル変数の問題

分類Dev

Angular4のインストールの問題

分類Dev

Angular4グローバル変数設定の問題

分類Dev

Angular4複数モジュールの問題

分類Dev

Angular4でのBootstrap4の使用

分類Dev

Angular4プロジェクトでのノードサスの問題

分類Dev

Angular4マルチレベルアコーディオンの問題

分類Dev

Angular4のChangeDetectorRefのエラー

分類Dev

divへのcanvas要素の追加-Angular4

分類Dev

Angular4でのjsDiffの実装

分類Dev

angular4 / typescriptのdocument.getElementById置換?

分類Dev

Angular4アレイの検証

分類Dev

WordpressのAngular4アプリ

分類Dev

Angular4 +フォームの検証

分類Dev

Angular4とClojureScriptの背景情報

分類Dev

税率のAngular4データ検証

分類Dev

Angular4の@ Input @ OutputとEventEmitter

分類Dev

Angular2 / Angular-cli:ローカルプロジェクトをAngular4に更新する際の問題

分類Dev

Angular4でのブートストラップ4グリッドの問題

分類Dev

Angular4 / 5でのイベントハンドラーのパフォーマンスの問題

分類Dev

Angular4コンポーネントの双方向バインディングの問題

分類Dev

パスの前に「%2f」文字を追加することによるangular4ルートの問題

Related 関連記事

ホットタグ

アーカイブ