<R>(observer: Observer<R>)中的R是什么=> 订阅 |函数 |空白
What is R in <R>(observer: Observer<R>) => Subscription | Function | void
Angularfire2 项目有一个正在进行的分支添加了存储功能。两个新文件包括一个 Observable class 和一个 Factory 函数。
可观察到class
export class FirebaseUploadTaskObservable<T> extends Observable<T> {
constructor(
subscribe?: <R>(observer: Observer<R>) => Subscription | Function | void,
public uploadTask?:firebase.storage.UploadTask) {
super(subscribe);
}
lift<T, R>(operator: Operator<T, R>): Observable<R> {
const observable = new FirebaseUploadTaskObservable<R>();
observable.source = this;
observable.operator = operator;
observable.uploadTask = this.uploadTask;
return observable;
}
...
}
工厂函数
export function FirebaseUploadTaskFactory (uploadTask: UploadTask):
FirebaseUploadTaskObservable<UploadTaskSnapshot> {
const obsFunction = (obs: Observer<UploadTaskSnapshot>) => { ... };
const objectObservable = new FirebaseUploadTaskObservable(obsFunction, uploadTask);
...
}
简而言之,我得到的错误是:
Type 'R' is not assignable to type 'UploadTaskSnapshot'.
帮助强化了我认为我已经知道的关于 Typescript 中的 <T>
和泛型的知识,但是 <R>
是什么?
(完整错误信息)
Argument of type '(obs: Observer) => void' is not
assignable to parameter of type '((observer: Observer) => void |
Function | Subscription) | undefined'. Type '(obs:
Observer) => void' is not assignable to type
'(observer: Observer) => void | Function | Subscription'. Types
of parameters 'obs' and 'observer' are incompatible. Type
'Observer' is not assignable to type
'Observer'. Type 'R' is not assignable to type
'UploadTaskSnapshot'.
本例中的 <T>
和 <R>
是在 TypeScript 中使用 generics 的示例。
泛型的快速总结。您可以像这样用 通用类型参数 声明一个 interface/class/function:
class List<T> {
getItem(position: number): T { ... }
addItem(item: T): void { ... }
}
那么在使用的时候指定T
就可以一般使用了。在这种情况下,我们说我们指定 T
为类型 User
:
let x = new List<User>(); // a list of Users;
x.addItem(myUser); // we expect this to take an item of type User
x.getItem(0); // we expect this to return a number;
在英文中,<R>(observer: Observer<R>) => Subscription | Function | void
的意思是:
for any type R, a function that can turn an Observer of R into a Subscription or a function or a nothing
现在,您的构造函数具有签名 constructor(subscribe?: <R>(...
。这意味着它 要求 具有上述属性的函数,即它需要一个对任何类型的观察者都满意的函数。例如,此构造函数将不满足于:
const obsFunction = (obs: Observer<UploadTaskSnapshot>) => { ... }
哪个英文是a:
function that takes an Observer<UploadTaskSnapshot>
and returns something
因为它不是一个将 R 的观察者用于 任何类型 R 并喜欢它的函数。这个函数在观察者中有一种奇特的味道,构造函数无法容纳。
其他答案提供了一些关于如何解决问题的指示,但我相信您的 <R>
参数在这里可能是多余的。你可能只想要 (observer: Observer<T>)
.
我是 TypeScript 的新手,我从 TypeScript generic 中学到的是它只是一个类型变量,我们使用 T 来捕获类型,而不是值。
对于这道题,是另一种类型的变量,你可以给任何你想要的字母,但是对于这种情况,首先,你有两个类型变量,所以你需要两个不同的字母,其次,为什么要使用字母R?因为你想说这个类型变量是一个请求类型,就像你用T说这个类型变量是一个类型
Angularfire2 项目有一个正在进行的分支添加了存储功能。两个新文件包括一个 Observable class 和一个 Factory 函数。
可观察到class
export class FirebaseUploadTaskObservable<T> extends Observable<T> {
constructor(
subscribe?: <R>(observer: Observer<R>) => Subscription | Function | void,
public uploadTask?:firebase.storage.UploadTask) {
super(subscribe);
}
lift<T, R>(operator: Operator<T, R>): Observable<R> {
const observable = new FirebaseUploadTaskObservable<R>();
observable.source = this;
observable.operator = operator;
observable.uploadTask = this.uploadTask;
return observable;
}
...
}
工厂函数
export function FirebaseUploadTaskFactory (uploadTask: UploadTask):
FirebaseUploadTaskObservable<UploadTaskSnapshot> {
const obsFunction = (obs: Observer<UploadTaskSnapshot>) => { ... };
const objectObservable = new FirebaseUploadTaskObservable(obsFunction, uploadTask);
...
}
简而言之,我得到的错误是:
Type 'R' is not assignable to type 'UploadTaskSnapshot'.
<T>
和泛型的知识,但是 <R>
是什么?
(完整错误信息)
Argument of type '(obs: Observer) => void' is not assignable to parameter of type '((observer: Observer) => void | Function | Subscription) | undefined'. Type '(obs: Observer) => void' is not assignable to type '(observer: Observer) => void | Function | Subscription'. Types of parameters 'obs' and 'observer' are incompatible. Type 'Observer' is not assignable to type 'Observer'. Type 'R' is not assignable to type 'UploadTaskSnapshot'.
<T>
和 <R>
是在 TypeScript 中使用 generics 的示例。
泛型的快速总结。您可以像这样用 通用类型参数 声明一个 interface/class/function:
class List<T> {
getItem(position: number): T { ... }
addItem(item: T): void { ... }
}
那么在使用的时候指定T
就可以一般使用了。在这种情况下,我们说我们指定 T
为类型 User
:
let x = new List<User>(); // a list of Users;
x.addItem(myUser); // we expect this to take an item of type User
x.getItem(0); // we expect this to return a number;
在英文中,<R>(observer: Observer<R>) => Subscription | Function | void
的意思是:
for any type R, a function that can turn an Observer of R into a Subscription or a function or a nothing
现在,您的构造函数具有签名 constructor(subscribe?: <R>(...
。这意味着它 要求 具有上述属性的函数,即它需要一个对任何类型的观察者都满意的函数。例如,此构造函数将不满足于:
const obsFunction = (obs: Observer<UploadTaskSnapshot>) => { ... }
哪个英文是a:
function that takes an
Observer<UploadTaskSnapshot>
and returns something
因为它不是一个将 R 的观察者用于 任何类型 R 并喜欢它的函数。这个函数在观察者中有一种奇特的味道,构造函数无法容纳。
其他答案提供了一些关于如何解决问题的指示,但我相信您的 <R>
参数在这里可能是多余的。你可能只想要 (observer: Observer<T>)
.
我是 TypeScript 的新手,我从 TypeScript generic 中学到的是它只是一个类型变量,我们使用 T 来捕获类型,而不是值。
对于这道题,是另一种类型的变量,你可以给任何你想要的字母,但是对于这种情况,首先,你有两个类型变量,所以你需要两个不同的字母,其次,为什么要使用字母R?因为你想说这个类型变量是一个请求类型,就像你用T说这个类型变量是一个类型