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

时间:2017-02-05 19:26:45

标签: javascript node.js typescript

我使用了一些像这样的javascript代码来捕获Node.js中的用户输入:

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'类型上不存在。

所以,我已经改变了一点代码,我已经将所有内容封装在一个类中,并且我的stdin属性的类型正确:

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()

由于我的类属性stdin的类型为tty.ReadStream,因此以前未知的方法setRawMode是已知的,但现在,构造函数中的赋值失败了:

  

错误TS2322:类型'ReadableStream'不能分配给'ReadStream'类型。     'ReadableStream'类型中缺少属性'isRaw'。

那么,我做错了什么?我怎么解决这个问题?同样,在JavaScript中一切正常。

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

3 个答案:

答案 0 :(得分:2)

一个简单的解决方案是将any类型分配给stdin

const stdin: any = process.stdin;

尝试设置正确的类型或将Type断言应用于process.stdin会导致更多的TypeScript错误(就像您在问题中描述的那样)。

在我看来,Typescript无法处理process.stdin两种不同的类型,net.Socket或Readable,请参阅docs

  

process.stdin属性返回连接到stdin(fd 0)的流。它是一个net.Socket(它是一个Duplex流),除非fd 0引用一个文件,在这种情况下它是一个可读流。

知道正确的解决方案是很好的。

答案 1 :(得分:0)

陷入同样的​​问题;升级到最新节点v6.10。 它的API文档有点毛茸茸,但我设法让我的代码更正为build并运行:

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

查看工作示例:npm install xvt

答案 2 :(得分:0)

我不知道这是否晚了一点,但这也可以编译:

import * as tty from "tty";
if(process.stdin instanceof tty.ReadStream){
  process.stdin.setRawMode(true);
}