6つ以上のforkJoinパラメーターを回避しますか?

Simm28

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]

編集
0

コメントを追加

0

関連記事

分類Dev

Angular7は2つ以上のパラメーターをASP.NETサーバーに送信します

分類Dev

「1つ以上の必須パラメーターに値が指定されていません。」を取得します。

分類Dev

Python argparseは、1つ以上のパラメーターを引数に設定します

分類Dev

2つ以上のパラメーターを使用してphpからireportを呼び出すことはできますか?

分類Dev

Ansible-varsからの1つ以上のパラメーターを使用してシェルコマンドを実行します

分類Dev

Visual Studio Code Typescriptは、改行のパラメーターを回避します

分類Dev

興味のないパラメータに対する暗黙の警告を回避しますか?

分類Dev

MysqlLIKEと2つ以上のパラメーターを持つREGEXP

分類Dev

文字列から1つ以上のパターンを抽出します

分類Dev

150以上のパラメータとデータの不一致を使用してINSERTクエリにアクセスします。どのパラメータが間違っているかを見つける方法は?

分類Dev

パラメータの順序に依存しない一般化された形式のstd :: same_as(つまり、3つ以上の型パラメータ)を実装するにはどうすればよいですか?

分類Dev

RxSwiftを使用したcombineLatestの8つ以上のパラメーター

分類Dev

RxSwiftを使用したcombineLatestの8つ以上のパラメーター

分類Dev

Java Beanに1つ以上のパラメーター化されたコンストラクターを含めることはできますか?

分類Dev

jspページからjasperレポートに2つ以上のパラメータを渡す方法

分類Dev

いくつかのintパラメータの最大値を取得します

分類Dev

1つのコントローラーのパラメーターとしてGUIDを使用しますか?

分類Dev

2つ以上のURLパラメータをページに渡す

分類Dev

追加のタイプパラメータは無効なオーバーライドエラーを回避しますか?

分類Dev

3つ以上のパラメーターを使用して最小/最大を計算する

分類Dev

2つ以上のパラメーターを使用してWCFサービスコントラクトを呼び出すことはできません

分類Dev

djangoを使用した関数に基づいて、ビューで2つ以上のパラメーターを送信します

分類Dev

Restangular-RestangularService.one()でいくつかのパラメータを送信します

分類Dev

キーワード引数を持つPython動的関数は、未使用のパラメーターを回避します

分類Dev

1つ以上の必須パラメーターに値が指定されていません-テキストをAccessにインポートします

分類Dev

バッチを使用して1つの文字列から2つのパラメータを取得しますか?

分類Dev

可変引数(3つ以上のパラメーター)を取ることができる最大または最小マクロを実装できますか?

分類Dev

Javaメソッドで2つ以上のリターンを回避する方法

分類Dev

MIPS-パラメータとして4つ以上の文字列

Related 関連記事

  1. 1

    Angular7は2つ以上のパラメーターをASP.NETサーバーに送信します

  2. 2

    「1つ以上の必須パラメーターに値が指定されていません。」を取得します。

  3. 3

    Python argparseは、1つ以上のパラメーターを引数に設定します

  4. 4

    2つ以上のパラメーターを使用してphpからireportを呼び出すことはできますか?

  5. 5

    Ansible-varsからの1つ以上のパラメーターを使用してシェルコマンドを実行します

  6. 6

    Visual Studio Code Typescriptは、改行のパラメーターを回避します

  7. 7

    興味のないパラメータに対する暗黙の警告を回避しますか?

  8. 8

    MysqlLIKEと2つ以上のパラメーターを持つREGEXP

  9. 9

    文字列から1つ以上のパターンを抽出します

  10. 10

    150以上のパラメータとデータの不一致を使用してINSERTクエリにアクセスします。どのパラメータが間違っているかを見つける方法は?

  11. 11

    パラメータの順序に依存しない一般化された形式のstd :: same_as(つまり、3つ以上の型パラメータ)を実装するにはどうすればよいですか?

  12. 12

    RxSwiftを使用したcombineLatestの8つ以上のパラメーター

  13. 13

    RxSwiftを使用したcombineLatestの8つ以上のパラメーター

  14. 14

    Java Beanに1つ以上のパラメーター化されたコンストラクターを含めることはできますか?

  15. 15

    jspページからjasperレポートに2つ以上のパラメータを渡す方法

  16. 16

    いくつかのintパラメータの最大値を取得します

  17. 17

    1つのコントローラーのパラメーターとしてGUIDを使用しますか?

  18. 18

    2つ以上のURLパラメータをページに渡す

  19. 19

    追加のタイプパラメータは無効なオーバーライドエラーを回避しますか?

  20. 20

    3つ以上のパラメーターを使用して最小/最大を計算する

  21. 21

    2つ以上のパラメーターを使用してWCFサービスコントラクトを呼び出すことはできません

  22. 22

    djangoを使用した関数に基づいて、ビューで2つ以上のパラメーターを送信します

  23. 23

    Restangular-RestangularService.one()でいくつかのパラメータを送信します

  24. 24

    キーワード引数を持つPython動的関数は、未使用のパラメーターを回避します

  25. 25

    1つ以上の必須パラメーターに値が指定されていません-テキストをAccessにインポートします

  26. 26

    バッチを使用して1つの文字列から2つのパラメータを取得しますか?

  27. 27

    可変引数(3つ以上のパラメーター)を取ることができる最大または最小マクロを実装できますか?

  28. 28

    Javaメソッドで2つ以上のリターンを回避する方法

  29. 29

    MIPS-パラメータとして4つ以上の文字列

ホットタグ

アーカイブ