Ответ 1
Прототипом, который вы ищете, является поток stream.Readable
для читаемых потоков и stream.Writable
для записываемых потоков. Они работают так же, как при проверке Buffer
.
У меня есть функция, которая получает объект, который может быть string
, Buffer
или Stream
.
Я могу легко проверить, является ли объект Buffer следующим:
if (x instanceof Buffer)
Какой лучший способ проверить, является ли объект Stream? Кажется, что нет базового класса Stream в node - есть?
Что я должен искать?
Прототипом, который вы ищете, является поток stream.Readable
для читаемых потоков и stream.Writable
для записываемых потоков. Они работают так же, как при проверке Buffer
.
Для 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
Не все потоки реализованы с использованием 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