Node.js process.stdin问题typescript(tty.ReadStream vs ReadableStream)

我用这样的一些JavaScript代码来捕获Node.js中的用户input:

if (process.stdin.isTTY) { process.stdin.setRawMode(true) process.stdin.setEncoding('utf8') process.stdin.resume() // safe shutdown if key 'q' is pressed process.stdin.on('data', key => { if (key === 'q') { console.log('quit') ... process.exit() } }) } ... 

这工作正常。 现在,我尝试在TypeScript中做同样的事情,但是在这里,当我尝试传输代码时,出现错误:

错误TS2339:属性'setRawMode'在'ReadableStream'types上不存在。

所以,我已经改变了一些代码,我已经把所有的东西封装在一个类中,使用了我的stdin属性的正确types:

 import * as tty from 'tty' class MyClass { private stdin: tty.ReadStream constructor() { this.stdin = process.stdin } exec() { if (this.stdin.isTTY) { this.stdin.setRawMode(true) this.stdin.setEncoding('utf8') this.stdin.resume() // safe shutdown if key 'q' is pressed this.stdin.on('data', (key:string) => { if (key === 'q') { console.log('quit') ... process.exit() } }) } ... } } const myClass = new MyClass() myClass.exec() 

由于我的类属性标准input是typestty.ReadStream以前未知的方法setRawMode是已知的,但现在,构造函数中的分配失败:

错误TS2322:types“ReadableStream”不能分配给“ReadStream”types。 在'ReadableStream'types中缺less属性'isRaw'。

那么,我做错了什么? 我该如何解决这个问题? 再次,在JavaScript中一切正常。

我在ARMv7(Raspberry Pi2)上使用了Node.js 7.5.0,TypeScript 2.1.5,@ types / node 7.0.5,

一个简单的解决scheme是将anytypes分配给stdin

const stdin: any = process.stdin;

试图设置正确的types或应用Type断言process.stdin导致进一步TypeScript错误(就像你在你的问题中描述)。

在我看来,Typescript不能处理process.stdin是两个不同的types,net.Socket或Readable,请参阅文档 :

process.stdin属性返回连接到stdin(fd 0)的stream。 它是一个net.Socket(它是一个Duplexstream),除非fd 0指向一个文件,在这种情况下它是一个Readablestream。

知道什么是正确的解决scheme真是太好了。

跑到同一个问题; 升级到最新的节点v6.10。 它的API文档有点多毛,但我设法纠正了编译和运行的代码:

 const tty = require('tty') if (tty.isatty(0)) tty.ReadStream().setRawMode(true) 

看一个工作的例子: npm install xvt