2016-09-29 30 views
0

次のコードスニペットは、JQuery getJSON()呼び出しを実行し、JQueryXHRプロミスの結果はオブザーバブルに変換されます。 、TypeScript:error TS2345: 'JQueryXHR'型の引数が 'Promise <any>'のパラメータに割り当てられません

app/app.component.ts(28,61): error TS2345: Argument of type 'JQueryXHR' is not assignable to parameter of type 'Promise<any>'. 
    Types of property 'then' are incompatible. 

プロミスにJQueryXHRオブジェクトをキャストまたは変換するきれいな方法、または別のタイプがあります:

/// <reference path="../typings/tsd.d.ts" /> 

import { Component } from '@angular/core'; 
import { Observable } from 'rxjs/Rx'; 

@Component({ 
    selector: 'my-app', 
    template: ` 
     <input id="search" type="text" class="form-control"> 
    ` 
}) 
export class AppComponent { 
    example(searchTerm: string) { 
    let url: string = 
     "https://api.spotify.com/v1/search?type=artist&q=" + searchTerm; 
    let jqueryXhr: JQueryXHR = $.getJSON(url); 
    let observable: Observable<any> = Observable.fromPromise(jqueryXhr); 
    } 
} 

この例では、実行時に作業を行いますが、TSCのコンパイラは、次のエラーがスローされますObservableに変換することができますか?

答えて

2

Is there a clean way to cast or convert a JQueryXHR object to a Promise?

あなたはまさにそのPromise.resolveを探しています。

しかし、タイプだけがより正確であれば、現在のコードはすでに動作するはずです。 は必要ありませんが、ThenableJQueryXHRThenableインターフェイスを実装する必要があります。

+0

、財産の種類は、「それから」の暗黙的または明示的なキャストを使用して、エラーが生じ、互換性がありません。しかし、Promise.resolve()の提案を使用して、これはコンパイラを満足させました。答えをありがとう。 –

+0

ええ、それは、オースタブルと約束の違いです。後者では、 'then'メソッドの戻り値とそのコールバックが重要です。 – Bergi

2

回答(感謝@Bergi):エラーパー

/// <reference path="../typings/tsd.d.ts" /> 

import { Component } from '@angular/core'; 
import { Observable } from 'rxjs/Rx'; 

@Component({ 
    selector: 'my-app', 
    template: ` 
     <input id="search" type="text" class="form-control"> 
    ` 
}) 
export class AppComponent { 
    example(searchTerm: string) { 
    let url: string = 
     "https://api.spotify.com/v1/search?type=artist&q=" + searchTerm; 
    let jqueryXhr: JQueryXHR = $.getJSON(url); 
    let promise: Promise<any> = Promise.resolve(jqueryXhr); 
    let observable = Observable.fromPromise(promise); 
    } 
} 
関連する問題