typescript - Kan jag använda typdeklarationsfiler från node_modules utan att importera de faktiska modulerna?


Jag laddar teachable machine-bildbiblioteket med en skript-tagg:

 <script src="https://cdn.jsdelivr.net/npm/@teachablemachine/[email /dist/teachablemachine-image.min.js"></script>

I mitt TypeScript-projekt använder jag tmImage-koden på följande sätt:

let model = await tmImage.load(modelURL, metadataURL)

Vilket ger detta fel i Typescript:

cannot find name `tmImage`

Så jag behöver typdeklarationsfiler, som inte finns tillgängliga på https://github.com/DefinitelyTyped/, men SOM finns tillgängliga i själva modulen. Så jag installerade det med:

npm install @teachablemachine/image

Nu finns det inne i node_modules många korsrefererande .d.ts-filer som innehåller all nödvändig typinformation.

Jag antog att Visual Studio Code automatiskt skulle hämta all information från .d.ts-filer i mitt projekt, men detta händer bara när jag faktiskt importerar modulerna med:

import * as tmImage from '@teachablemachine/image';

Nu känner koden igen typerna väldigt bra med kodkomplettering, men jag behöver också kompilera teachable machine-koden tillsammans med min egen kod!

Är det möjligt att använda endast typinformationen från node_modules under utvecklingstid, eller behöver jag överge min <script>-tagg och kompilera all teachable machine-kod själv, bara för att jag använder Typescript?

Svar #1

Du kompilerar inte biblioteket varje gång, du importerar det bara. Biblioteket är redan kompilerat inuti node_modules. Så du kan använda importerna och utesluta dem från din bundlare om du använder en sådan.

Om du vill att typerna ska vara tillgängliga globalt behöver du lägga till en .d.ts-fil till ditt projekt. TS förutsätter inte att en typ är tillgänglig bara för att den finns i node_modules, men du kan lägga till det genom att utöka det globala namnområdet på detta sätt:

// In a `.d.ts` file within the included folders of your project
import * as _tmImage from '@teachablemachine/image';

declare global {
    const tmImage: typeof _tmImage;
}