Typescript 在<;R>;(观察员:观察员<;R>;)=>;认购|功能|无效

Typescript 在<;R>;(观察员:观察员<;R>;)=>;认购|功能|无效,typescript,observers,typescript-generics,Typescript,Observers,Typescript Generics,Angularfire2项目有一个正在进行的分支,添加了存储功能。两个新文件包括一个可观察类和一个工厂函数 可观测类 export class FirebaseUploadTaskObservable<T> extends Observable<T> { constructor( subscribe?: <R>(observer: Observer<R>) => Subscription | Function | void,

Angularfire2项目有一个正在进行的分支,添加了存储功能。两个新文件包括一个可观察类和一个工厂函数

可观测类

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;
  }
  ...
}
导出类FirebaseUploadTaskObservable扩展了Observable{
建造师(
订阅?:(观察员:观察员)=>订阅|功能|无效,
公共上传任务?:firebase.storage.uploadTask){
超级(认购);
}
升降机(操作员:操作员):可观察{
const observable=新FirebaseUploadTaskObservable();
可观测源=此;
可观察。操作员=操作员;
observable.uploadTask=此.uploadTask;
可观测收益;
}
...
}
工厂功能

export function FirebaseUploadTaskFactory (uploadTask: UploadTask):
  FirebaseUploadTaskObservable<UploadTaskSnapshot> {

  const obsFunction = (obs: Observer<UploadTaskSnapshot>) => { ... };

  const objectObservable = new FirebaseUploadTaskObservable(obsFunction, uploadTask);

  ...
}
导出函数FirebaseUploadTaskFactory(uploadTask:uploadTask):
FirebaseUploadTaskObservable{
常量obsFunction=(obs:Observer)=>{…};
const objectObservable=新的FirebaseUploadTaskObservable(obsFunction,uploadTask);
...
}
简而言之,我得到的错误是:

类型“R”不可分配给类型“UploadTaskSnapshot”

帮助强化了我认为我已经知道的关于
和Typescript中的泛型的知识,但什么是

(完整错误消息)

类型为“(obs:Observer)=>void”的参数不可用 可分配给“((观察者:观察者)=>void”类型的参数| 函数|订阅)|未定义”。类型(obs: 观察者)=>void'不可分配给类型 “(观察员:观察员)=>void |函数|订阅”。类型 参数“obs”和“observer”不兼容。类型 “观察者”不可分配给类型 “观察员”。类型“R”不可分配给类型 “UploadTaskSnapshot”

和本例中的
是在类型脚本中使用的示例

泛型的快速总结。您可以使用泛型类型参数声明接口/类/函数,如下所示:

和本例中的
是在类型脚本中使用的示例

泛型的快速总结。您可以使用泛型类型参数声明接口/类/函数,如下所示:

在英语中,
(观察员:观察员)=>订阅|功能|无效
表示:

对于任何类型的R,都是一个函数,可以将R的观察者转换为订阅、函数或无

现在,您的构造函数具有签名
构造函数(subscribe?:(…
)。这意味着它需要一个具有上述属性的函数,也就是说,它需要一个对任何类型的观察者都满意的函数。例如,此构造函数不会满足于:

const obsFunction = (obs: Observer<UploadTaskSnapshot>) => { ... }
constobsfunction=(obs:Observer)=>{…}
其中英文为:

函数,它接受一个
观察者
并返回一些内容

因为它不是一个函数,对于任何类型的R都不会接受R的观察者,这个函数在观察者中有一种特殊的味道,而构造函数却不能适应

其他答案提供了一些如何解决问题的指示,但我相信您的
参数在这里可能是多余的。您可能只需要
(observer:observer)

在英语中,
(observer:observer)=>订阅|函数|无效
表示:

对于任何类型的R,都是一个函数,可以将R的观察者转换为订阅、函数或无

现在,您的构造函数具有签名
构造函数(subscribe?:(…
)。这意味着它需要一个具有上述属性的函数,也就是说,它需要一个对任何类型的观察者都满意的函数。例如,此构造函数不会满足于:

const obsFunction = (obs: Observer<UploadTaskSnapshot>) => { ... }
constobsfunction=(obs:Observer)=>{…}
其中英文为:

函数,它接受一个
观察者
并返回一些内容

因为它不是一个函数,对于任何类型的R都不会接受R的观察者,这个函数在观察者中有一种特殊的味道,而构造函数却不能适应


其他答案提供了一些关于如何解决问题的指示,但我相信您的
参数在这里可能是多余的。您可能只需要
(observer:observer)

我对TypeScript不熟悉,我从TypeScript generic中学到的是,它只是一个类型变量,我们使用T来捕获类型,而不是值


对于这个问题,是另一个类型变量,你可以给任何你想要的字母,但是对于这个问题,首先,你有两个类型变量,所以你需要两个不同的字母,第二,为什么要用字母R?因为你想说这个类型变量是一个请求类型,就像你用T说这个类型变量是一个类型一样t、 我从TypeScript generic中学到的是,这只是一个类型变量,我们使用t来捕获类型,而不是值


对于这个问题,是另一个类型变量,你可以给出你想要的任何字母,但是对于这个问题,首先,你有两个类型变量,所以你需要两个不同的字母,其次,为什么要使用字母R?因为你想说这个类型变量是一个请求类型,就像你用T说这个类型变量是一个类型一样,你的解释很有说服力关于T是什么,但问题是关于R的。你的解释说明了T是什么,但问题是关于R的。简单地使用
(observer:observer)
,是很有诱惑力的,但是Observable类中的另一个方法与
操作符一起工作
方法,但如果它有助于澄清问题,仍然可以添加它:@StealthtenInja似乎codebase正在遭受rxjs本身所遭受的痛苦;
lift
中的
T
是冗余的。
可观察的
需要实施
提升(操作员:操作员):可观测的
。请注意,
T
由观测类型决定
const obsFunction = (obs: Observer<UploadTaskSnapshot>) => { ... }