TypeScript - Variabeln har implicit typen 'any' på vissa platser där dess typ inte kan bestämmas


Jag försöker konvertera innehållet i en uppladdad fil till en MD5-hash. Jag försöker deklarera en global deklaration för att använda inuti funktioner. Men när jag försöker använda den får jag felet Variabeln 'hasher' har implicit typen 'any' på vissa ställen där dess typ inte kan bestämmas.

  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 = 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);
      });
    }

    // tslint:disable-next-line:no-shadowed-variable
    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);
      }

      // tslint:disable-next-line:no-shadowed-variable
      const hash = hasher.digest();
      return Promise.resolve(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;
  }

Hur kan jag definiera det korrekt?

Svar #1

Problemet är att tsc inte kan avgöra vad hasher ska vara. Detta är ett av de sällsynta fallen där du måste definiera dess typ uttryckligen, på detta sätt:

let hasher: IHasher? = null;

Vilket berättar för tsc att hasher är antingen en IHasher eller undefined eller null (se till att först importera IHasher-typen från hash-wasm-paketet!)