Думаю, я знал, что это было - PullRequest
0 голосов
/ 18 марта 2019

В приведенном ниже фрагменте кода я использую сервис (Angular) для извлечения текста через fileReader, используя обещание для асинхронной части. Проблема, с которой я столкнулся, - это (я считаю) проблема сфер, и я в замешательстве. В моем компоненте я объявляю переменную экземпляра: myDoc: docWrapperClass.

Обычно, когда программа чтения файлов извлекает текст, я хочу присвоить результаты этой локальной переменной. Все работает хорошо, пока я не попытаюсь выполнить задание. т.е .: this.myDoc = docContents, когда обещание разрешается (в настоящее время комментарий закомментирован).

Когда оператор остается в компиляторе, он жалуется: Тип '{}' нельзя назначить типу docWrapperClass: fileName.

В docWrapperClass есть свойство с именем fileName, но не уверен, что означает {}. Я закомментировал назначение, а затем поместил точку останова в оператор console.log в блоке then (). Когда я печатаю «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;
    });
}

}

1 Ответ

1 голос
/ 18 марта 2019

this.fileReaderService.readFile не имеет возвращаемой подписи, поэтому, когда вы вызываете then для возвращаемого значения, компилятор Typescript не знает, с чем он работает. Следовательно, ваш docContents имеет тип {}, который нельзя назначить вашему типу docWrapperClass.

Одним из больших преимуществ TypeScript в первую очередь является безопасность типов. Вы должны определить тип возвращаемого значения readFile равным Promise<docWrapperClass>, а также определить тип возвращаемого значения всех ваших функций.

Как только компилятор узнает, что метод возвращает Promise<docWrapperClass, он может правильно сделать вывод, что docContents можно присвоить myDoc.

...