我已经围成一圈追赶自己了,现在是时候寻求帮助了。我有以下(Typescript)服务可打开文件读取器,并根据文件类型调用readAsText()或readAsArrayBuffer()。我有一个包装类(MyDocument),用于fileReader返回的文本以及有关该文档的一些元数据。在MyDocument类中,我定义了一个名为docContent:string的字段。这是麻烦开始的地方。由于条件if语句(用粗体显示)选择了readAsText或readAsArray缓冲区,因此编译器不喜欢将fileReader结果分配给docConent,因为它可以是字符串或ArrayBuffer。所以我将字段修改为: docContent:字符串| ArrayBuffer认为我有多聪明。但是现在该字段可以是字符串,也可以是ArrayBuffer,编译器不会让我操作docContents字段(就像split('\ n'),因为split不属于ArrayBuffer。我知道必须有一个更优雅的解决该问题的方法,但是我离它太近了以至于看不清。不胜感激。
public readFile(files: FileList): MyDocument {
this.myDocument = new MyDocument();
if (files && files[0] && files[0].size > 0) {
this.fileToRead = files[0];
this.myDocument.fileName = this.fileToRead.name;
this.myDocument.fileSize = this.fileToRead.size;
this.myDocument.fileType = this.fileToRead.type;
}
else {
const message = "Either no file selected, or file has zero size";
confirm(message);
}
if (this.fileToRead) {
var fr = new FileReader();
fr.onloadend = () => {
if (this.myDocument.fileType == "text/plain") {
this.myDocument.docContents = fr.result;
} else {
let extractedText = this.extractTextUsingSolr(fr.result);
}
}
***if (this.fileToRead.type == 'text/plain') {
fr.readAsText(this.fileToRead);
}
else {
fr.readAsArrayBuffer(this.fileToRead);
}***
return this.myDocument;
}
else {
console.log('No file selected!');
return;
}
}
〜
仅此而已,这是MyDocument类,当我尝试执行docContents.split(“ \ n”)时,编译器会抱怨该地方。
export class MyDocument {
fileName: string;
fileType: string;
fileSize: number;
numWords: number;
numSents: number;
docWords: string[];
docContents: string | ArrayBuffer;
processDocument(): void {
const sents = [];
const lines = this.docContents.split("\n");
let sentWords = [];
}
}
答案 0 :(得分:1)
快速修复
if (typeof this.docContents === 'string') {
lines = this.docContents.split("\n");
} else {
// dealing with ArrayBuffer
// google on methods in ArrayBuffer object you can use
}
但是我个人不喜欢这种方法。我将使用2个具有不同名称的不同属性。一个用于ArrayBuffer,另一个用于文本字符串。