1

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

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

(observer: Observer<any> | ((值:任何)=> 无效)): void

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

'(res: any) => void' 类型的参数不可分配给'Observer' 类型的参数。类型“(res:any)=> void”中缺少属性“next”。

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

4

2 回答 2

4

正如@echonax 所说:这意味着或正如@Rob 所说的它是联合类型

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

第一个你限制你接受观察者的方法

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

这与之前提供的签名不匹配。

然后你在方法中添加了类似签名的动作

 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(): 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): 一个函数,其输入为anyvalue,输出为void

于 2016-12-22T05:26:10.003 回答