我有一个函数可以接收一个可能是string
,Buffer
或Stream
的对象。
我可以轻松测试对象是否像这样的缓冲区:
if (x instanceof Buffer)
测试对象是否为Stream的最佳方法是什么?节点中似乎没有Stream基类 - 是吗?
我应该寻找什么?
答案 0 :(得分:11)
对于Readable
,你可以这样做:
var stream = require('stream');
function isReadableStream(obj) {
return obj instanceof stream.Stream &&
typeof (obj._read === 'function') &&
typeof (obj._readableState === 'object');
}
console.log(isReadableStream(fs.createReadStream('car.jpg'))); // true
console.log(isReadableStream({}))); // false
console.log(isReadableStream(''))); // false
答案 1 :(得分:7)
您正在寻找的原型是可读流的stream.Readable
流,可写流的stream.Writable
。它们的工作方式与检查Buffer
时的工作方式相同。
答案 2 :(得分:5)
并非所有流都使用stream.Readable
和stream.Writable
实现。
process.stdout instanceof require("stream").Writable; // false
process.stdout instanceof require("readable-stream").Writable; // false
更好的方法是单独检查read(), write(), end()
函数。
var EventEmitter = require("events");
function isReadableStream(test) {
return test instanceof EventEmitter && typeof test.read === 'function'
}
function isWritableStream(test) {
return test instanceof EventEmitter && typeof test.write === 'function' && typeof test.end ==== 'function'
}
您可以随时访问:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/node.d.ts#L252