process.stdout,tty $ WriteStream。此类型与stream.Writable不兼容

时间:2016-05-26 09:26:18

标签: javascript flowtype

所以我得到了这种类型的错误,并没有多大意义

src/bins/assembler.js:19
 19:            compileTo(module, stdout);
                                  ^^^^^^ tty$WriteStream. This type is incompatible with
 11: export function compileTo(repr: ir.Module, target: stream.Writable) {
                                                        ^^^^^^^^^^^^^^^ stream$Writable. See: src/asm/output.js:11
  

澄清stdoutprocess.stdout

根据我的理解stdoutstream.Writable,我检查了实施中的type of stdout是否确定,是的,是......

declare class Process extends events$EventEmitter {
  ...
  stdout : stream$Writable | tty$WriteStream;
  ...
}

declaration var process: Process;

不确定我做错了什么......但我使用的是最新版本的流程(截至今天)

$ flow version
> Flow, a static type checker for JavaScript, version 0.25.0

就像我想要完成的是拥有一个函数来编写通用输出,例如文件或在这种情况下stdout,并且根据我的理解stream.Writable就是那种类型,并且stdout根据它的声明订阅了它的界面...

我的假设是否正确,还是我误解了|运算符在stdout定义中的观点?我是否必须更加明确compileTo中的类型?或者在设置flow时我做错了什么?

这是我的第一个流程项目,所以我可能错过了一些明显的东西......

1 个答案:

答案 0 :(得分:3)

根据stdout declaration的规定,类型可以是stream$Writabletty$WriteStream。由于您的compileTo函数只接受仅由stream.Writable解析的声明stream$Writable,因此您只能传递与此类型匹配的参数。

如果我们仔细查看其他声明,则无法将tty$WriteStream的分辨率分配给Stream.Writable

declare class tty$WriteStream extends net$Socket
declare class net$Socket extends stream$Duplex
declare class stream$Duplex extends stream$Readable

要使其工作,只需将两种类型作为可能的参数添加。

function compileTo(repr: ir.Module, target: stream.Writable | tty.WriteStream) {}

如果您不想仅为定义导入tty模块,请使用类型的全局定义。

function compileTo(repr: ir.Module, target: stream$Writable | tty$WriteStream) {}