Angular 2 & Typescript 可观察函数参数——管道有什么作用?

Angular 2 & Typescript Observable Function Parameter - What Does Pipe Do?

最近我需要在一个函数中接受一个Observer参数,我正在用脑袋敲桌子试图弄清楚如何在Typescript中做到这一点。您可能还记得在 C# 中使用 delegate 参数;这基本上就是我在这里试图做的。这是 subscribe(observer: Observer<any>) 的一部分。我这样做的原因是因为我试图为订阅添加一个 AOP 类型的书挡。这不是重点。

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

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

我的问题基本上是函数签名中粗体部分的作用是什么?我已经搜索了所有我能想到但无法弄清楚的资源。没有 | 之后的部分,我得到了这个错误:

Argument of type '(res: any) => void' is not assignable to parameter of type 'Observer'. Property 'next' is missing in type '(res: any) => void'.

一旦我添加了竖线字符和之后的部分,我就能够以传统的观察者方式(使用箭头函数)毫无问题地进行订阅,并且我还确认所有订阅都有效(这排除了之后的部分管道是默认值)。任何想法都将不胜感激,因为我讨厌看到某些东西起作用但不知道为什么!

表示observer的类型是Observer<any>

|()

((value: any) => void) : 输入为 any 值,输出为 void.

的函数

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

但我开始写这个,我不想把它扔掉:),只是因为我很慢。 :)

1st 你限制你的方法接受观察者

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

然后你尝试用像签名这样的动作来调用它 其中 Action 就像

    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

但总是return订阅

例如:

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);
    }
}