<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说这个类型变量是一个类型