最近我需要在一个函数中使用一个Observer参数,而我正试着弄清楚如何在Typescript中解决这个问题。您可能还记得在C#中使用delegate
参数;这基本上就是我在这里尝试做的事情。这是subscribe(observer: Observer<any>)
的一部分。我这样做的原因是因为我试图为订阅添加AOP类型的书挡。那不是重要的部分。
基本上要让它工作,你必须在函数参数后面添加一个|
字符,它最终会像这样:
(observer: Observer<any>
| ((值:任何)=&gt; void) ): void
我的问题基本上是大胆的部分在该功能签名中做了什么?我已经仔细研究了我能想到的每一种资源,但无法弄明白。如果没有|
之后的部分,我就会收到此错误:
类型的参数'(res:any)=&gt; void'不能赋值给参数 类型'观察者'。类型'中缺少属性'next'(res: 任何)=&gt;无效”。
一旦我添加了管道字符和部分后,我能够以传统的观察者方式(使用箭头函数)无问题地订阅,并且我还确认所有订阅都有效(它排除了管道之后的部分)是一个默认值)。任何想法都会受到赞赏,因为我讨厌看到一些有用的但却不知道为什么!
答案 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;
这意味着您可以订阅
但始终会返回订阅
例如:
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);
}
}