angular - 类型 'string' 不可分配给类型 'ArrayBuffer | 共享数组缓冲区 | 类数组'
问题描述
尝试验证 mime 类型
来自 VScode 的错误:src/app/posts/post-create/mimie-type.validator.ts(12,36) 中的错误:错误 TS2345:类型为 'string | 的参数 ArrayBuffer' 不能分配给 'ArrayBuffer | 类型的参数 共享数组缓冲区 | 类数组'。类型 'string' 不可分配给类型 'ArrayBuffer | 共享数组缓冲区 | 类数组'。
问题在第 12 行,带有 fileReader.result.... 不确定我在代码中到底哪里出错了。任何帮助是极大的赞赏
import { AbstractControl } from '@angular/forms';
import { Observable, Observer } from 'rxjs';
export const mimeType = (
control: AbstractControl
): Promise<{ [key: string]: any }> | Observable<{ [key: string]: any }> => {
const file = control.value as File;
const fileReader = new FileReader();
const frObs = Observable.create(
(observer: Observer<{ [key: string]: any }>) => {
fileReader.addEventListener('loadend', () => {
const arr = new Uint8Array(fileReader.result).subarray(0, 4);
let header = '';
let isValid = false;
for (let i = 0; i < arr.length; i++) {
header += arr[i].toString(16);
}
switch (header) {
case '89504e47':
isValid = true;
break;
case 'ffd8ffe0':
case 'ffd8ffe1':
case 'ffd8ffe2':
case 'ffd8ffe3':
case 'ffd8ffe8':
isValid = true;
break;
default:
isValid = false; // Or you can use the blob.type as fallback
break;
}
if (isValid) {
observer.next(null);
} else {
observer.next({ invalidMimeType: true });
}
observer.complete();
});
fileReader.readAsArrayBuffer(file);
}
);
return frObs;
};
解决方案
fileReader.result
is 类型,这string | ArrayBuffer
意味着它可以是 astring
或ArrayBuffer
取决于您调用哪个方法来读取文件。for 的构造函数Uint8Array
只能接受一个ArrayBuffer
,这就是你得到错误的原因,因为对于编译器,结果也可以是一个string
. 简单的解决方案就是说我知道这将是ArrayBuffer
这样的:
const arr = new Uint8Array(fileReader.result as ArrayBuffer).subarray(0, 4);
更好的解决方案是首先验证结果实际上是您期望的类型,然后编译器不会抱怨,因为它知道它是正确的类型。
if (fileReader.result instanceof ArrayBuffer) {
const arr = new Uint8Array(fileReader.result).subarray(0, 4);
// the rest of your code
} else {
throw new Error('Unexpected result');
}
推荐阅读
- laravel - 将当前日志流式传输到存储文件夹
- compilation - 如何获取我编辑的启动代码以进行编译?
- c++ - 难以理解某人的源代码来解决 IOI 问题
- c - 每个打印行之后有 2 个空白行
- javascript - 红移是否保证身份列的顺序插入?
- data-structures - 实现投票系统的最佳数据结构
- python - 在关闭程序之前添加文件后如何从 file.txt 中检索信息
- android - 如何过滤 Android 应用程序链接以仅接受具有特定参数的 url?
- flutter - A RenderFlex 右侧溢出 1029 像素
- xcode - FBAudience 网络作为框架集成