使用Typescript、Observable和bindCallback方法进行推理
我正在nodejs和typescript中编写一个函数来搜索文件中的特定模式。 通过使用Typescript、Observable和bindCallback方法进行推理,typescript,types,rxjs,observable,Typescript,Types,Rxjs,Observable,我正在nodejs和typescript中编写一个函数来搜索文件中的特定模式。 通过readline节点包提供的函数逐行读取文件 代码大致如下所示 import * as readline from 'readline'; .... .... function _findSnippets( filePath: string, startSnippetToken: string, endSnippetToken: string, callback: (filePat
readline
节点包提供的函数逐行读取文件
代码大致如下所示
import * as readline from 'readline';
....
....
function _findSnippets(
filePath: string,
startSnippetToken: string,
endSnippetToken: string,
callback: (filePath: string, snippets: Array<Array<string>>) => void
) {
// do some prep stuff
const snippet = new Array<string>();
const rl = readline.createInterface({
input: fs.createReadStream(filePath),
crlfDelay: Infinity
});
rl.on('line', (line: string) => {
let isLineToBeAddedToSnippet: boolean;
// do the core of the logic to set the correct value for
// the variable isLineToBeAddedToSnippet
if (isLineToBeAddedToSnippet) {
snippet.push(line);
}
})
rl.on('close', () => {
callback(filePath, snippet);
})
}
现在我想通过推理看到Typescript显示\u findSnippetsObs
函数返回一个可观察的变量,发出某种“对”变量,即回调的参数,它是\u findSnippets
函数的最后一个参数。相反,我通过intellisense看到的是\u findSnippetsObs
返回一个可观察的
,正如您在这个快照中看到的那样
在我看来,智能感知功能,特别是在异步可观察行为方面,是一个非常重要的工具
因此,如果有人能帮我纠正这个问题,我将不胜感激。bindCallback方法解析为对
BoundCallbackObservable.create
的调用,该调用具有
您的\u findSnippets
函数接受三个字符串参数和一个回调参数,因此相关的重载有以下两个:
静态创建(
callbackFunc:(v1:T,v2:T2,v3:T3,callback:(结果:R)=>any)=>any,
选择器?:无效,
调度程序?:IScheduler
):(v1:T,v2:T2,v3:T3)=>可观察;
静态创建(
callbackFunc:(v1:T,v2:T2,v3:T3,callback:(…args:any[])=>any)=>any,
选择器:(…args:any[])=>R,
调度程序?:IScheduler
):(v1:T,v2:T2,v3:T3)=>可观察;
您没有指定选择器,因此第一个重载是匹配的,因为回调的多余参数将被忽略。该重载的匹配将R
推断为string
,这解释了您通过intellisense看到的内容
对于接收多个参数的回调,需要有某种机制将接收到的参数打包成可以从可观察对象发出的内容,即可以是数组或对象。为此,需要指定一个选择器。例如:
const\u findSnippetsObs=Observable.bindCallback(
_findSnippets,
(FielPATH:字符串、代码片段:数组,并考虑添加一个侦听器用于<代码>错误< /代码>事件-如果它们有可能由<代码> RetryS> <代码>发出。这样做会允许使用可观察流来报告和处理错误。首先感谢您的回答。它工作得很好。关于推断,我想再问你一个问题:R
被推断为string
,因为\u findSnippets
回调的第一个输入参数是string
。另一方面,在第二种情况下,R
是选择器的返回值,因此它得到whatev的类型呃选择器返回,对吗?
const _findSnippetsObs = Observable.bindCallback(_findSnippets);