На вашем скриншоте вы пытаетесь расширить класс Transform
, но вы не реализуете правильный метод, вы должны реализовать transform._transform(chunk, encoding, callback)
, тогда машинопись автоматически выведет требуемые типы.* * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * *}} [Тогда, когда в вашем коде вы выбрали «упрощенный» конструктор Transform
, поэтому компилятор не выдает предупреждение.,Конструктор принимает набор параметров, который позволяет вам определять необходимые методы преобразования без явного расширения класса.Эти параметры выбирают соглашение о присвоении имен с префиксом без подчеркивания, но они эквивалентны методам с префиксом подчеркивания при расширении класса.Так как вы использовали правильное имя для метода здесь, типы могли быть выведены.
API Transform
требует реализации трех методов, эти методы обрисованы в общих чертах здесь .
Существует два способа реализации потока Transform
:
- Расширение класса
Transform
- Использование параметров конструктора
Transform
.
Обрисованы два метода здесь (включен пример расширения класса в средах до ES6).
При реализации Transform
В потоковом режиме должен быть реализован только один метод:
transform._transform(chunk, encoding, callback)
Два других метода являются необязательными и могут быть реализованы, если для этого используется сценарий использования:
transform._flush(callback)
writable._final(callback)
Я описал документированные методы Transform
ниже, выделив некоторые области, которые могутпредставлять интерес.
Эта функция НЕ ДОЛЖНА бытьвызывается по коду приложения напрямую.Он должен быть реализован дочерними классами и вызываться только внутренними методами класса Readable.
В некоторых случаях для операции преобразования может потребоваться выброс дополнительного бита данных в конце потока.Например, поток сжатия zlib будет хранить количество внутреннего состояния, используемого для оптимального сжатия вывода.Однако, когда поток заканчивается, эти дополнительные данные необходимо сбросить, чтобы сжатые данные были завершены.
Пользовательские реализации преобразования могут реализовать метод transform._flush (). Это будет вызвано, когда больше нет записанных данных, которые должны быть использованы, но до того, как будет отправлено событие 'end', сигнализирующее об окончании считываемого потока.
В реализации transform._flush ()метод readable.push () может вызываться ноль или более раз, в зависимости от ситуации.Функция обратного вызова должна вызываться после завершения операции сброса.
Метод transform._flush () имеет префикс с подчеркиванием, поскольку он является внутренним по отношению к классу, который его определяет, и никогда не должен вызыватьсянепосредственно пользовательскими программами.
Эта функция НЕ ДОЛЖНА вызываться кодом приложения напрямую.Он должен быть реализован дочерними классами и вызываться только внутренними методами класса Readable.
Все реализации потока Transform должны предоставлять метод _transform () для приема ввода и вывода вывода. Реализация transform._transform () обрабатывает записываемые байты, вычисляет вывод, а затем передает этот вывод в читаемую часть, используя метод readable.push ().
Метод transform.push () можетможет вызываться ноль или более раз для генерации вывода из одного входного блока, в зависимости от того, сколько должно быть выведено в результате блока.
Возможно, что никакой выход не генерируется ни из одного данного блока вводаdata.
Функция обратного вызова должна вызываться только тогда, когда текущий фрагмент полностью используется.Первый аргумент, переданный обратному вызову, должен бытьобъект Error, если во время обработки ввода произошла ошибка или null,Если второй аргумент передается обратному вызову, он будет перенаправлен в метод readable.push ().Другими словами, следующие значения эквивалентны:
transform.prototype._transform = function(data, encoding, callback) {
this.push(data);
callback();
};
transform.prototype._transform = function(data, encoding, callback) {
callback(null, data);
};
Преобразованию метода transform._transform () предшествует символ подчеркивания, поскольку он является внутренним по отношению к классу, который его определяет, иникогда не должен вызываться напрямую пользовательскими программами.
transform._transform () никогда не вызывается параллельно;Потоки реализуют механизм очереди, и для получения следующего фрагмента необходимо вызвать обратный вызов, синхронно или асинхронно.
Метод _final () не должен вызываться напрямую.Он может быть реализован дочерними классами и, если это так, будет вызываться только внутренними методами класса Writable.
Эта необязательная функция будет вызываться до закрытия потока, задерживая событие 'finish' дообратный вызов называется.Это полезно для закрытия ресурсов или записи буферизованных данных до окончания потока.