我以为我知道这是什么

Thought I knew what this was

在下面的代码片段中,我使用服务 (Angular) 通过 fileReader 提取文本,对异步部分使用承诺。我遇到的问题是(我相信)范围问题并且对此感到困惑。在我的组件中,我声明了一个实例变量: myDoc:docWrapperClass。

基本上当文件reader提取文本的时候,我想把结果赋值给这个局部变量。在我尝试完成作业之前,一切都很好。 IE。: this.myDoc = docContents 当 promise 解决时(当前注释掉)。

当语句留在编译器中时抱怨: 类型“{}”不可分配给类型 docWrapperClass:fileName。

docWrapperClass 上有一个名为 fileName 的 属性,但不确定 {} 的含义。我已经注释掉了赋值,然后在 then() 块中的 console.log 语句上打了一个断点。当我打字时 "this" 在控制台中,我得到 undefined,这真的让我很困惑。我至少希望 "this" 有一个函数。我的问题是如何将承诺返回的 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;
    });
}

}

this.fileReaderService.readFile 没有 return 签名,所以当你调用 then 它的 returned 值时,Typescript 编译器不知道它在做什么和。因此,您的 docContents 是类型 {},不能分配给您的类型 docWrapperClass

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

一旦编译器知道方法 return 是 Promise<docWrapperClass,它就可以正确地推断出 docContents 可以分配给 myDoc