forkJoinで6つ以上のパラメーターを使用する必要性/要望があります。現在、別の関連する質問への回答に基づいて、forkJoinに6つを超えるパラメーターを送信することはできないようです。
ただし、公式ドキュメントに基づくと、「forkJoinは、配列として、または直接引数として渡すことができる任意の数のObservableを受け取る演算子です」と記載されています。
forkJoin-公式ドキュメント
さて、私はそれをやっていて、エラーが発生しますTS2322:タイプ 'foo'はタイプ 'bar []'に割り当てることができません。
私の調査では、異なる型を返すpromiseがある場合は、引数を配列として送信しないのが最善であることがわかりました。これにより、引数がすべて同じ型に型キャストされるためです。-出典
これが私のコードです。TypescriptとAngular4の最新バージョンを使用しています。
ngOnInit() {
this.spinner.show();
Observable.forkJoin(
this.loadParams(), // Returns an Observable<Object>
this.service.getPromiseType1(), // The rest return Observable<Array>
this.service.getPromiseType2(),
this.service.getPromiseType3(),
this.service.getPromiseType4(),
this.service.getPromiseType5(),
this.service.getPromiseType6(),
).finally(() => this.spinner.hide())
.subscribe(
([param, promise1, promise2, promise3, promise4, promise5, promise6]) => {
this.job = job;
this.value1 = promise1;
this.value2 = promise2;
this.value3 = promise3;
this.value4 = promise4;
this.value5 = promise5;
this.value6 = promise6;
}, (error) => {errorHandlingFunction}
});
単一のパラメーターを削除して、6つのパラメーターをforkJoinに渡すと、正常に機能します。だから私の質問は、オブジェクトのオブザーバブルとそれに続く配列のオブザーバブルをすべて1回の呼び出しでロードしたい場合、これを行う別の方法はありますか?公式ドキュメントには、任意の数のObservableを受け入れることができるはずであると記載されているため、これはforkJoinのバグですか?
Observable型の配列を作成し、forkJoin内でarray.forEach()を使用しようとしましたが、void型を返すことについて文句を言います。それはとにかくそれをするためのぎこちない方法のように思えました。
以下のような答えがないランタイムソース自体-あなたがリンクされ、問題の説明、引数の最大数は、唯一の型定義によって制約されます。型定義は、監視可能なストリームの次のステップで生成される配列要素の型(この[param, promise1, promise2, ...]
場合はの型)を宣言するので便利です。
サブスクリプションハンドラーの割り当てに関する厳密な型安全性が問題の原因のようです。6つを超えるオブザーバブルがあるため、結果のパラメーターはデフォルトで共有タイプになります。これは、割り当てようとしているフィールドのタイプと一致しない可能性があります。
これを回避する方法はいくつかあります。サブスクリプションハンドラーで引数をキャストすることも、独自の型を自分で追加することもできます。引数をキャストすることは手っ取り早い解決策ですが、型の安全性を失う原因になります。自分で型を追加すると、型の安全性を維持できますが、ファクトリメソッド宣言がいくつもあることを意味する場合もあります。以下を*.d.ts
プロジェクトの任意のタイプ定義ファイル()に配置します。このような型定義typings/
を、自分のapp/
ディレクトリの兄弟レベルのディレクトリに配置するのが好きです。
import { Observable, SubscribableOrPromise } from 'rxjs/Observable';
declare module 'rxjs/observable/ForkJoinObservable' {
namespace ForkJoinObservable {
export function create<T, T2, T3, T4, T5, T6, T7>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, v5: SubscribableOrPromise<T5>, v6: SubscribableOrPromise<T6>, v7: SubscribableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;
export function create<T, T2, T3, T4, T5, T6, T7, R>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, v5: SubscribableOrPromise<T5>, v6: SubscribableOrPromise<T6>, v7: SubscribableOrPromise<T7>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => R): Observable<R>;
}
}
このプロセスについては、宣言のマージに関するTypeScriptのドキュメントページで詳しく説明されています。
編集:古いバージョンのRxJSを使用しているようですが、それ以降、構造が少し変更されています。以下は、現在の構造で機能する必要がある型宣言に近いはずです。
declare module 'rxjs/Observable' {
namespace Observable {
export function forkJoin<T, T2, T3, T4, T5, T6, T7>(sources: [ObservableInput<T>, ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4>, ObservableInput<T5>, ObservableInput<T6>, ObservableInput<T7>]): Observable<[T, T2, T3, T4, T5, T6, T7]>;
export function forkJoin<T, T2, T3, T4, T5, T6, T7>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, v7: ObservableInput<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;
}
}
私はこれらを現在のforkJoin型宣言に基づいています。
モジュールの拡張に関しては、上記のコードは絶対パスで定義されたモジュールの型宣言を変更します'rxjs/Observable'
。これは、Observable
クラスをインポートするときに使用するインポートパスと同じです。RxJSで定義されているモジュールは、Observable
クラスとそのフィールドをエクスポートします。そのモジュールへの拡張は、namespace
ブロックを使用してモジュールを変更します。これにより、Observable
名前空間の下に型宣言(たとえば、の型宣言Observable.myFunctionOrField
)を追加できます。これは、静的関数を呼び出すのと同じように見えます。事実上、これは追加のObservable.forkJoin
機能の可能性を宣言します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加