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-requiresnebo 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,
- 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
- 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.
