Vyhledávání na webu

typescript - splnit pravidlo ESLint "no-var-requires" při importu modulu bez souboru deklarace


V mém projektu NodeJS/TypeScript používám fluent-ffmpeg a funguje to dobře. Abych ho mohl používat, potřebuji importovat vlastnosti path jak z ffmpeg-installer/ffmpeg, tak z ffprobe-installer/ffprobe.

Import ffmpeg vypadá takto:

import * as ffmpegInstaller from "@ffmpeg-installer/ffmpeg";

To je možné díky existenci deklaracního souboru index.d.ts ve složce types modulu @ffmpeg-installer/ffmpeg.

Ohledně ffprobe to není možné, kvůli nedostatku deklarančního souboru jako je ten výše zmíněný. Při pokusu: import * as ffprobeInstaller from "@ffprobe-installer/ffprobe"; se objeví chyba:

Nepodařilo se najít deklaraci souboru pro modul '@ffprobe-installer/ffprobe'. '<...>/node_modules/@ffprobe-installer/ffprobe/index.js' má implicitní typ 'any'. Zkuste npm i --save-dev @types/ffprobe-installer__ffprobe, pokud existuje, nebo přidejte nový deklaranční (.d.ts) soubor obsahující declare module '@ffprobe-installer/ffprobe';ts(7016)

Ani npm i --save-dev @types/ffprobe-installer__ffprobe nic nepřináší.

Takže místo toho používám const ffprobeInstaller=require("@ffprobe-installer/ffprobe"); a funguje to.

Nicméně, zde přichází ESLint a stěžuje si:

Příkaz require není součástí příkazu import. eslint (@typescript-eslint/no-var-requires)

Tak jsem se pokusil nahradit to tímto: import ffprobeInstaller=require("@ffprobe-installer/ffprobe");, jak je doporučeno v dokumentaci ESLint, ale pak se mi opět zobrazuje Could not find a declaration file...ts(7016).

Existuje několik směrů, kterými se mohu vydat, abych problém překonal:

  • Vytváření mého vlastního deklarovaného souboru
  • zakázat pravidla no-var-requires nebo je ignorovat lokálně

Má otázka je: Jak mohu splnit pravidlo no-var-requires ESLint bez vytváření deklarančního souboru a ani vypínání tohoto pravidla.

Odpověď č. 1

Přemýšlej o svém problému ze dvou stran,

  1. Jak projít TypeScript - Samozřejmě potřebujete soubor s deklaracemi, buď napsáním vlastního souboru, nebo instalací existujícího balíčku
  2. Jak projít eslintem -> Použijte import místo var-requires.

Zajímavé je, že require má návratový typ any. Proto jste si mysleli, že jste vyřešili část s TypeScriptem. Ve skutečnosti ale tento vestavěný typ funguje jako rychlý deklarovaný soubor a ztratí omezení typu.

interface NodeRequireFunction {
    (id: string): any;
}

Ve shrnutí, vytvoření deklarace je vyžadováno, bez ohledu na to, zda se jedná o soubor nebo něco implicitního. A eslint je jen něco, co bylo zavedené náhodou.

Odpověď č. 2

@ffprobe-installer/ffprobe je čistě javascriptový balíček, pro který nejsou dostupné žádné typy. Pokud jej chcete jen používat a zacházet se vším z něj jako s jakýmkoli typem (any), můžete udělat to, co navrhl kompilátor, a vytvořit nový deklarovaný soubor. Stačí, aby obsahoval pouze řádek

declare module '@ffprobe-installer/ffprobe'

Například vytvořte soubor s názvem ffprobe.d.ts v kořenovém adresáři vašeho zdrojového kódu, přidejte výše uvedený řádek a chyba při kompilaci zmizí.

Pokud chcete obejít chybu kompilátoru použitím require místo import, musíte pravidlo lintu vypnout pomocí eslint-disable-next-line nebo podobně. Není způsob, jak přestat, aby eslint stěžoval na použití require, aniž byste někde pravidlo nevypnuli, protože pravidlo dělá to, co má dělat.