Typescript 在<;R>;(观察员:观察员<;R>;)=>;认购|功能|无效
Angularfire2项目有一个正在进行的分支,添加了存储功能。两个新文件包括一个可观察类和一个工厂函数 可观测类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,
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>) => { ... }