打字稿和处理FileReader

时间:2019-03-13 16:13:43

标签: typescript

我正在尝试在客户端读取文件作为数组缓冲区。这是我的代码。

for (var index = 0; index < input.files.length;index++) {
  let reader = new FileReader();
  console.log(input.files[index].name);
  reader.onload = () => {
    var data:ArrayBuffer = reader.result;
    console.log(data.toString().length);
  }
  reader.readAsArrayBuffer(input.files[index])
}

但是我的编辑器抱怨reader.result返回(字符串| ArrayBuffer)

但是,如果我从数据中删除类型类型。我无法使用ArrayBuffer特定的方法,例如byteLength。

如何强制reader.result为ArrayBuffer?

1 个答案:

答案 0 :(得分:1)

你知道TS是很漂亮的xD。像平常那样编写代码,它将解释您的代码,一切都会滚动。

function foo() {
    return (
        Math.random() < 0.5
            ? "damn dis shit wild"
            : new ArrayBuffer(1024)
    )
}

let bar = foo(); // string | ArrayBuffer
if (bar instanceof ArrayBuffer) {
    // bar is only ArrayBuffer in this block :O *.*
    bar.byteLength; // <-- no error
} else {
    bar.startsWith("damn") // <-- no error
}

这里是demo。我想这就是您想要的吗?

您还提到了“强制”,所以正常的断言也可以使用,但是不建议使用,因为如果barstring,它会给运行时带来错误。

function foo() {
    return (
        Math.random() < 0.5
            ? "damn dis shit wild"
            : new ArrayBuffer(1024)
    )
}

let bar = <ArrayBuffer>foo();
bar.byteLength; // <-- no error

Demo