我使用了一些像这样的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
答案 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);
}