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

process.stdout, tty$WriteStream. This type is incompatible with stream.Writable

所以我收到了这个类型错误,而且没有多大意义

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

To clarify stdout is process.stdout

根据我的理解 stdout 是一个 stream.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 时做错了什么?

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

根据 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) {}