在下面的代码片段中,我正在使用服务(Angular)通过fileReader提取文本,并对异步部分使用了promise。我遇到的问题是(我认为)范围问题,对此感到困惑。在我的组件中,我声明了一个实例变量: myDoc:docWrapperClass。
基本上,当文件阅读器提取文本时,我想将结果分配给此局部变量。一切正常,直到我尝试完成作业。即: 当承诺解决时this.myDoc = docContents(当前注释掉)。
当该语句留在编译器中时会抱怨: 不能将类型“ {}”分配给docWrapperClass:fileName。
docWrapperClass上有一个名为fileName的属性,但不确定{}的含义。我已经注释掉了分配,然后在then()块的console.log语句上放置了一个断点。当我打字 在控制台中的“ this”,我不确定,这确实使我感到困惑。我至少希望功能有“ this”。我的问题是如何将从promise返回的docWrapperClass分配给实例变量?
export class myDocComponent implements OnInit {
constructor(private fileReaderService: ReadLocalFileService,
private textExtractor: TextExtractorServiceService) { }
ngOnInit() { }
docWords: string[] = [];
myDoc: docWrapperClass = null;
selectFile(event: any) {
console.log("Debug");
this.fileReaderService.readFile(event.target.files)
.then((docContents) => {
console.log("DocContents: " + docContents);
//this.myDoc = docContents;
});
}
}
答案 0 :(得分:1)
this.fileReaderService.readFile
没有返回签名,因此当您在返回值上调用then
时,Typescript编译器不知道它的工作方式。因此,您的docContents
类型为{}
,不能分配给您的类型docWrapperClass
。
首先,TypeScript的一大优点是类型安全。您应该将readFile
的返回类型定义为Promise<docWrapperClass>
,并同样定义所有函数的返回类型。
一旦编译器意识到该方法返回了Promise<docWrapperClass
,它就可以正确地推断出docContents
可分配给myDoc
。