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
相关产品推荐
相关产品推荐

