1

最近、関数で Observer パラメーターを取得する必要があり、Typescript でこれを行う方法を理解しようとして机に頭をぶつけていました。delegateC# でパラメーターを取得したことを思い出すかもしれません。それが基本的に私がここでやろうとしていたことです。これは の一部でしたsubscribe(observer: Observer<any>)。私がこれを行った理由は、サブスクリプション用の AOP タイプのブックエンドを追加しようとしていたからです。それは重要な部分ではありません。

|基本的にこれを機能させるには、関数パラメーターの後ろに文字を追加する必要があり、最終的には次のようになります。

(observer: Observer<any> | | ((値: 任意) => void)): void

私の質問は基本的に、その関数シグネチャの太字部分は何をするのですか? 考えられるすべてのリソースを精査しましたが、理解できません。の後の部分がないと、次の|エラーが発生しました。

'(res: any) => void' 型の引数は、'Observer' 型のパラメーターに代入できません。タイプ '(res: any) => void' にプロパティ 'next' がありません。

パイプ文字とその後の部分を追加すると、従来のオブザーバーの方法 (矢印関数を使用) で問題なくサブスクライブできました。価値)。何かが機能するのを見るのは嫌いですが、理由がわからないので、どんなアイデアでも大歓迎です!

4

2 に答える 2

4

@ekonaxが言ったように:@Robがユニオンタイプだと言ったようにORを意味します

しかし、私はこれを書き始めましたが、それを捨てる気がしません:)、単に私が遅いからです。:)

最初に、オブザーバーを受け入れるように yuor メソッドを制限しました

class SubscribeMe<T> {
    observable: Observable<T>;
    susbscribe(observer: Observer<T>){
        return observable.susbscribe(observer);
    }
}

次に、アクションが似ている署名のようなアクションでそれを呼び出そうとしました

    type Action = <T>(t:T)=> void     

することによって:

    susbscribeMe = new SubscribeMe<any>();
    susbscribeMe.susbscribe((x)=> console.log(x));

以前に提供された署名と一致しません。

次に、署名のようなアクションをメソッドに追加しました

 class SubscribeMe<T> {
    observabel: Observable<T>
    susbscribe(observer: Observer<T>| (x)=> void ){
        return observable.susbscribe(observer);
    }
}    

また...

 class SubscribeMe<T> {
    observabel: Observable<T>
    susbscribe(observer: Observer<T>| Action<T>){
        return observable.susbscribe(observer);
    }
}

それであなたはタイプスクリプトに、アクションまたはオブザーバーで私を呼び出すことができると言いました

...そして最後に、Rx.Observableインターフェース(rxjs/Observable.d.ts)により、これはすべて可能です

次のような「subscribe」のオーバーロードされた署名を定義します

 *  subscribe(): Subscription;
 *  subscribe(observer: PartialObserver<T>): Subscription;
 *  subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;

つまり、サブスクライブできます

  • またはアクション
  • またはオブザーバー
  • または Null/Nothing/Nada

ただし、常にサブスクリプションを返します

元:

import * as Rx from "rxjs";

export class SubscribeMe<T> {

    private _events = new Rx.Subject<T>();

    /** 
    * Hide the source of the observable  
    * */
    get events(): Rx.Observable<T> { return this._events.asObservable(); }

    /**
    *  Accept any signature accepted by Rx.Observabe INTERFACE (rxjs/Observable.d.ts)
    *  subscribe(): Subscription;
    *  subscribe(observer: PartialObserver<T>): Subscription;
    *  subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;
    * 
    * as in OR Action<Ievent> Or Observer<Ievent> Or Null/Nothing/Nada
    */
    subscribe = (observer?: (e:T) => void | Rx.Observer<T>) => {
        return this.events.subscribe(observer);
    }
}
于 2016-12-22T07:18:30.120 に答える
3

observerがタイプであることを意味しますObserver<any>

|(または)

((value: any) => void): 入力がany値で出力がである関数void

于 2016-12-22T05:26:10.003 に答える