You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript报hasher隐式any类型错误,如何正确定义该变量的类型

解决方法

这个报错是因为你初始化hasher时只赋值为null,TypeScript 无法自动推断出该变量后续的实际类型,触发了隐式any的类型校验规则,按以下方式显式声明类型即可解决:


两种可选实现方案

方案1:自动推导类型(无需额外导入,适配你当前用require的场景)

直接修改hasher的声明行,通过TS的类型运算自动获取createMD5返回的实例类型:

// 把原来的 let hasher = null; 替换成下面这行
let hasher: Awaited<ReturnType<typeof hashwasm.createMD5>> | null = null;

由于代码逻辑中走到调用hasher.update()、hasher.digest()的位置时,hasher肯定已经完成初始化不会为null,可以给对应调用位置加非空断言消除残留的空类型校验提示:

// hashChunk方法内修改为
hasher!.update(view);
// digest调用位置修改为
const hash = hasher!.digest();

方案2:显式导入hash-wasm内置类型

如果你的项目支持ES模块导入,可以先导入hash-wasm提供的IHasher类型再声明变量:

// 代码顶部先导入类型
import type { IHasher } from 'hash-wasm';

// 变量声明改为
let hasher: IHasher | null = null;

修改后的完整代码参考

private async hashContentMD5() {
  // Converts content to MD5
  const CryptoJS = require('crypto-js');
  const hashwasm = require('hash-wasm');

  const chunkSize = 64 * 1024 * 1024;
  const fileReader = new FileReader();
  // 修改类型声明
  let hasher: Awaited<ReturnType<typeof hashwasm.createMD5>> | null = null;

  function hashChunk(chunk: any) {
    return new Promise<void>((resolve, reject) => {
      fileReader.onload = async (e: any) => {
        const view = new Uint8Array(e.target.result);
        hasher!.update(view);
        resolve();
      };

      fileReader.readAsArrayBuffer(chunk);
    });
  }

  const readFile = async (file: any) => {
    if (hasher) {
      hasher.init();
    } else {
      hasher = await hashwasm.createMD5();
    }

    const chunkNumber = Math.floor(file.size / chunkSize);

    for (let i = 0; i <= chunkNumber; i++) {
      const chunk = file.slice(
        chunkSize * i,
        Math.min(chunkSize * (i + 1), file.size)
      );
      await hashChunk(chunk);
    }

    // 加非空断言
    const hash = hasher!.digest();
    // async函数本身返回Promise,无需手动包Promise.resolve
    return hash;
  };

  // Converts Content MD5 to Base64
  const file = (document.getElementById('fileName')as any).files[0];
  const hash = await readFile(file);
  const promiseArray = CryptoJS.enc.Utf8.parse(hash);
  const content_md5 = CryptoJS.enc.Base64.stringify(promiseArray);

  return content_md5;
}

内容的提问来源于stack exchange,提问作者johnnyrocket33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:36:05