以为我知道这是什么

时间:2019-03-18 20:09:21

标签: angular scope instance-variables

在下面的代码片段中,我正在使用服务(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;
    });
}

}

1 个答案:

答案 0 :(得分:1)

this.fileReaderService.readFile没有返回签名,因此当您在返回值上调用then时,Typescript编译器不知道它的工作方式。因此,您的docContents类型为{},不能分配给您的类型docWrapperClass

首先,TypeScript的一大优点是类型安全。您应该将readFile的返回类型定义为Promise<docWrapperClass>,并同样定义所有函数的返回类型。

一旦编译器意识到该方法返回了Promise<docWrapperClass,它就可以正确地推断出docContents可分配给myDoc