НПМ пакет csv-parse реализует Node.js поток как API:Как объявить Stream-подобный интерфейс в TypeScript?
const parser = parse();
parser.on('readable',() => {
let record: any; // <-- it should be string[]
while (record = parser.read()) {
output.push(record);
}
});
Его type declaration является:
interface parse {
(options?: options): NodeJS.ReadWriteStream;
}
Тип возврата parse
является NodeJS.ReadWriteStream
, который имеет метод read
возвращающегося string | Buffer
.
interface ReadWriteStream extends ReadableStream, WritableStream {
// ...
}
interface ReadableStream extends EventEmitter {
read(size?: number): string | Buffer;
// ...
}
По этому определению, я не могу определить переменную let record: any = parser.read()
его фактического типа string[]
.
Я попытался изменить определение типа из CSV-синтаксический анализ, как это:
interface ParserStream extends NodeJS.ReadWriteStream {
read(size?: number): string[];
}
interface parse {
(options?: options): ParserStream;
}
Это не работает, потому что машинопись не позволяет расширить интерфейс и изменить тип возвращаемого значения.
То, что я могу думать о том, чтобы изменить NodeJS поток для универсального типа, как:
interface GenericReadableStream <T> extends EventEmitter {
read(size?: number): T
// ...
}
interface ReadableStream extends GenericReadableStream <string | Buffer> {}
Тогда я могу определить:
interface ParserStream extends GenericReadableStream <string[]> {}
Я не знаю, если это хороший способ. Это сильно влияет на текущие определения типа Node.JS.
Я тестировал на TypeScript 2.0.3. Intersaction 'any' и' string [] 'is' any'. Таким образом, по-прежнему можно назначить 'number []'. – aleung
О да, я упростил ответ и не проверял. Вам нужен один промежуточный интерфейс между ReadWriteStream и CsvParser, в котором вы переопределяете 'read', чтобы возвращать' any & string [] ', а затем в CsvParser вы можете переопределить его, чтобы вернуть только' string [] '. Я снова проверю и обновлю ответ. – artem
Я обновил ответ - я думаю, он должен работать сейчас – artem