的NPM包csv-parse实现的Node.js流等API:如何在TypeScript中声明一个类似Stream的接口?
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上测试过。 'any'和'string []'的交互作用是'any'。所以它仍然可以分配给'number []'。 – aleung
哦,是的,我简化了答案,没有检查。在ReadWriteStream和CsvParser之间需要一个中间接口,在其中重写'read'来返回'any&string []',然后在CsvParser中,您可以重写它以仅返回'string []'。我会再次检查并更新答案。 – artem
我更新了答案 - 我认为它现在应该可以工作 – artem