首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从Observable.bindNodeCallback(fs.readFile)在TypeScript中创建可观察的

无法从Observable.bindNodeCallback(fs.readFile)在TypeScript中创建可观察的
EN

Stack Overflow用户
提问于 2017-04-18 02:31:16
回答 2查看 3K关注 0票数 8

我试图使用rxjs 5用TypeScript编写Node.js服务器,但在将fs.readFile转换为rxjs形式时遇到了错误。我希望下面的代码可以在TypeScript中工作

代码语言:javascript
复制
// This is a JavaScript example from the official documentation. It should
// also work at the TypeScript envrionment.

import * as fs from 'fs';
import { Observable } from 'rxjs';

let readFileAsObservable = Observable.bindNodeCallback(fs.readFile);

// This is the line that throws the error.
let result = readFileAsObservable('./roadNames.txt', 'utf8');

result.subscribe(x => console.log(x), e => console.error(e));

但是,当我添加第二个参数TypeScript时,编辑器会报告一个'utf-8'错误。

代码语言:javascript
复制
Supplied parameters do not match any signature of call target.

我试图找到关于如何在rxjs和TypeScript中使用TypeScript的指南,但是没有太多的运气。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-18 03:54:16

bindCallbackbindNodeCallback在TypeScript中可能比较棘手,因为这都取决于TypeScript如何推断函数参数。

可能有一个更好的方法,但这是我所做的,以确切地看到什么是被推断出来的:将可观察到的分配到完全不相容的东西,并仔细观察受影响的错误。例如,这是:

代码语言:javascript
复制
const n: number = Observable.bindNodeCallback(fs.readFile);

将影响此错误:

代码语言:javascript
复制
Type '(v1: string) => Observable<Buffer>' is not assignable to type 'number'.

因此,很明显,TypeScript正在匹配readFile的路径唯一重载。

在这种情况下,我经常使用箭头函数来指定我想要使用的重载。例如,这是:

代码语言:javascript
复制
const n: number = Observable.bindNodeCallback((
  path: string,
  encoding: string,
  callback: (error: Error, buffer: Buffer) => void
) => fs.readFile(path, encoding, callback));

将影响此错误:

代码语言:javascript
复制
Type '(v1: string, v2: string) => Observable<Buffer>' is not assignable to type 'number'.

因此,它现在匹配所需的重载,下面的内容可以工作:

代码语言:javascript
复制
let readFileAsObservable = Observable.bindNodeCallback((
  path: string,
  encoding: string,
  callback: (error: Error, buffer: Buffer) => void
) => fs.readFile(path, encoding, callback));

let result = readFileAsObservable('./package.json', 'utf8');
result.subscribe(
  buffer => console.log(buffer.toString()),
  error => console.error(error)
);
票数 18
EN

Stack Overflow用户

发布于 2017-06-01 09:06:30

老实说,我还没有找到解决方案,但为了让它发挥作用,我把它转换成了一个函数。

代码语言:javascript
复制
(<Function>Rx.Observable.bindNodeCallback(fs.readFile))('./file.txt', 'utf8').subscribe();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43462628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档