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);
}
}
最近我需要在一个函数中接受一个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);
}
}