Angular 2& Typescript Observable函数参数 - 管道做什么?

时间:2016-12-22 05:11:01

标签: angular typescript angular2-observables

最近我需要在一个函数中使用一个Observer参数,而我正试着弄清楚如何在Typescript中解决这个问题。您可能还记得在C#中使用delegate参数;这基本上就是我在这里尝试做的事情。这是subscribe(observer: Observer<any>)的一部分。我这样做的原因是因为我试图为订阅添加AOP类型的书挡。那不是重要的部分。

基本上要让它工作,你必须在函数参数后面添加一个|字符,它最终会像这样:

(observer: Observer<any> | ((值:任何)=&gt; void) ): void

我的问题基本上是大胆的部分在该功能签名中做了什么?我已经仔细研究了我能想到的每一种资源,但无法弄明白。如果没有|之后的部分,我就会收到此错误:

  

类型的参数'(res:any)=&gt; void'不能赋值给参数   类型'观察者'。类型'中缺少属性'next'(res:   任何)=&gt;无效”。

一旦我添加了管道字符和部分后,我能够以传统的观察者方式(使用箭头函数)无问题地订阅,并且我还确认所有订阅都有效(它排除了管道之后的部分)是一个默认值)。任何想法都会受到赞赏,因为我讨厌看到一些有用的但却不知道为什么!

2 个答案:

答案 0 :(得分:3)

这意味着observer的类型为Observer<any>

|(

((value: any) => void):输入为any值且输出为void的函数。

答案 1 :(得分:3)

正如@echonax所说:它意味着OR,因为@Rob说它是Union Type

但是我开始写这篇文章并且我不想丢掉它:),因为我很慢。 :)

首先你限制了yuor方法接受观察者

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

然后您尝试使用类似签名的Action来调用它     Action就像

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

做:

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

这与之前提供的签名不符。

然后您在方法

中添加了像签名一样的Action
 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);
    }
}