Ошибка после обновления до angular 7. Аргумент типа 'string | ArrayBuffer 'не может быть назначен параметру типа' string '

1

Я обновил свой проект с угловой 6 до угловой 7. В моем проекте есть компонент для загрузки файлов. Выдает ошибку компилятора после обновления.

onUpload() {
    const fileReader = new FileReader();
    fileReader.onload = () => this.uploadFile(fileReader.result);
    fileReader.readAsText(this.fileToUpload);
}

uploadFile(fileContent: string) {
    //upload
}

В приведенном выше коде this.uploadFile(fileReader.result) выдает следующую ошибку.

ошибка TS2345: аргумент типа 'строка | ArrayBuffer 'не может быть назначен параметру типа' string '

Тип fileReader.result - string | ArrayBuffer string | ArrayBuffer, и он говорит, что это не может быть присвоено string. Как я могу преобразовать string | ArrayBuffer Тип string | ArrayBuffer для string?

  • 1
    Вы пробовали fileReader.result as string ?
  • 0
    @Zze это работает. Я не знал о том, as string . Пожалуйста, добавьте свой комментарий в качестве ответа.
Теги:
angular
angular7

3 ответа

4
Лучший ответ

Хотя у result есть возможность вернуть строку, он не может неявно привести ее к строке, так как существует риск потери данных. т.е. ArrayBuffer as string может привести к усечению данных (придется проверить). Таким образом, вы должны явно привести его, чтобы сказать компилятору "я знаю, что я делаю".

2 подхода для достижения этой цели:

(string)fileReader.result;
fileReader.result as string;
  • 1
    Ответ Мальволио более правильный. Это просто скрывает проблему под ковриком. Когда он снова укусит вас, вам будет интересно, почему он не работает: он не работает, потому что вы лжете на TypeScript.
2

Вам нужен typeguard, как это:

if (this.fileToUpload instanceof ArrayBuffer) {
  // throw an error, 'cause you can't handle this
} else {
    fileReader.readAsText(this.fileToUpload);
}
1

Вы можете использовать метод toString() для анализа результата:

 const file = event.target.files[0];
 reader.readAsDataURL(file);

 const base64 = reader.result.toString().split(',')[1];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню