【发布时间】:2017-02-01 12:50:24
【问题描述】:
npm 包 csv-parse 实现了类似 Node.JS Stream 的 API:
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-parse 的类型定义:
interface ParserStream extends NodeJS.ReadWriteStream {
read(size?: number): string[];
}
interface parse {
(options?: options): ParserStream;
}
它不起作用,因为 TypeScript 不允许扩展接口和更改方法的返回类型。
我能想到的是将 NodeJS Stream 更改为通用类型,例如:
interface GenericReadableStream <T> extends EventEmitter {
read(size?: number): T
// ...
}
interface ReadableStream extends GenericReadableStream <string | Buffer> {}
那么我可以定义:
interface ParserStream extends GenericReadableStream <string[]> {}
我不知道这是否是一个好方法。它对当前的 Node.JS 类型定义影响很大。
【问题讨论】:
标签: typescript typescript-typings